annotate dmd/Type.d @ 178:e3afd1303184

Many small bugs fixed Made all classes derive from TObject to detect memory leaks (functionality is disabled for now) Began work on overriding backend memory allocations (to avoid memory leaks)
author korDen
date Sun, 17 Oct 2010 07:42:00 +0400
parents 1475fd394c9e
children 190ba98276b3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1 module dmd.Type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 113
diff changeset
3 import dmd.common;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4 import dmd.TY;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
5 import dmd.Parameter;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6 import dmd.TOK;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
7 import dmd.STC;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
8 import dmd.TypeArray;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
9 import dmd.DotVarExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
10 import dmd.ErrorExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
11 import dmd.StringExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
12 import dmd.IntegerExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
13 import dmd.VarExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
14 import dmd.TemplateParameter;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
15 import dmd.TypeInfoSharedDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
16 import dmd.TypeInfoConstDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
17 import dmd.TypeInfoInvariantDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
18 import dmd.Module;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
19 import dmd.Id;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
20 import dmd.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
21 import dmd.VarDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
22 import dmd.Loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
23 import dmd.Scope;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
24 import dmd.OutBuffer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
25 import dmd.Identifier;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
26 import dmd.HdrGenState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
27 import dmd.Expression;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
28 import dmd.Dsymbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
29 import dmd.MATCH;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
30 import dmd.TypeInfoDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
31 import dmd.ClassDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
32 import dmd.StringTable;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
33 import dmd.ArrayTypes;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
34 import dmd.TypeBasic;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
35 import dmd.DYNCAST;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
36 import dmd.MOD;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
37 import dmd.Lexer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
38 import dmd.TypeSArray;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
39 import dmd.TypeDArray;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
40 import dmd.TypeAArray;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
41 import dmd.TypePointer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
42 import dmd.TypeReference;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
43 import dmd.TypeFunction;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
44 import dmd.TypeDelegate;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
45 import dmd.TypeIdentifier;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
46 import dmd.TypeInstance;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
47 import dmd.TypeTypeof;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
48 import dmd.TypeReturn;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
49 import dmd.TypeStruct;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
50 import dmd.TypeEnum;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
51 import dmd.TypeTypedef;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
52 import dmd.TypeClass;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
53 import dmd.TypeTuple;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
54 import dmd.TypeSlice;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
55 import dmd.Global;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
56 import dmd.StringValue;
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
57 import dmd.TRUST;
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
58 import dmd.TemplateDeclaration;
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
59 import dmd.DotIdExp;
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
60 import dmd.AggregateDeclaration;
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
61 import dmd.DotTemplateInstanceExp;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
62 import dmd.Token;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
63 import dmd.TypeInfoWildDeclaration;
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
64
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
65 import dmd.expression.Util;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
66
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
67 import dmd.backend.Symbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
68 import dmd.backend.TYPE;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
69 import dmd.backend.dt_t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
70 import dmd.backend.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
71 import dmd.backend.TYM;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
72 import dmd.backend.mTY;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
73
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
74 import core.stdc.stdio;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
75
4
d706d958e4e8 Step 2 of restoring GC functionality.
korDen
parents: 2
diff changeset
76 import core.memory;
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
77
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
78 /* These have default values for 32 bit code, they get
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
79 * adjusted for 64 bit code.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
80 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
81
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
82 __gshared int PTRSIZE = 4;
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
83
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
84 __gshared int Tsize_t;
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
85 __gshared int Tptrdiff_t;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
86
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
87 /* REALSIZE = size a real consumes in memory
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
88 * REALPAD = 'padding' added to the CPU real size to bring it up to REALSIZE
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
89 * REALALIGNSIZE = alignment for reals
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
90 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
91 version (TARGET_OSX) {
157
b7b61140701d * added all missing default cases in switch statements
trass3r
parents: 140
diff changeset
92 extern(C++) __gshared int REALSIZE = 16;
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
93 __gshared int REALPAD = 6;
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
94 __gshared int REALALIGNSIZE = 16;
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 20
diff changeset
95 } else version (POSIX) { /// TARGET_LINUX || TARGET_FREEBSD || TARGET_SOLARIS
157
b7b61140701d * added all missing default cases in switch statements
trass3r
parents: 140
diff changeset
96 extern(C++) __gshared int REALSIZE = 12;
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
97 __gshared int REALPAD = 2;
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
98 __gshared int REALALIGNSIZE = 4;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
99 } else {
157
b7b61140701d * added all missing default cases in switch statements
trass3r
parents: 140
diff changeset
100 extern(C++) __gshared int REALSIZE = 10;
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
101 __gshared int REALPAD = 0;
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
102 __gshared int REALALIGNSIZE = 2;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
103 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
104
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
105 /****
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
106 * Given an identifier, figure out which TemplateParameter it is.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
107 * Return -1 if not found.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
108 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
109
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
110 int templateIdentifierLookup(Identifier id, TemplateParameters parameters)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
111 {
121
347de076ad34 TemplateParameters -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
112 foreach (size_t i, TemplateParameter tp; parameters)
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
113 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
114 if (tp.ident.equals(id))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
115 return i;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
116 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
117 return -1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
118 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
119
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
120 int templateParameterLookup(Type tparam, TemplateParameters parameters)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
121 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
122 assert(tparam.ty == Tident);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
123 TypeIdentifier tident = cast(TypeIdentifier)tparam;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
124 //printf("\ttident = '%s'\n", tident.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
125 if (tident.idents.dim == 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
126 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
127 return templateIdentifierLookup(tident.ident, parameters);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
128 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
129 return -1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
130 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
131
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
132 /***************************
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
133 * Return !=0 if modfrom can be implicitly converted to modto
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
134 */
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
135 int MODimplicitConv(MOD modfrom, MOD modto)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
136 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
137 if (modfrom == modto)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
138 return 1;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
139
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
140 //printf("MODimplicitConv(from = %x, to = %x)\n", modfrom, modto);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
141 static uint X(MOD m, MOD n)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
142 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
143 return (((m) << 4) | (n));
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
144 }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
145 switch (X(modfrom, modto))
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
146 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
147 case X(MOD.MODundefined, MOD.MODconst):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
148 case X(MOD.MODimmutable, MOD.MODconst):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
149 case X(MOD.MODwild, MOD.MODconst):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
150 case X(MOD.MODimmutable, MOD.MODconst | MOD.MODshared):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
151 case X(MOD.MODshared, MOD.MODconst | MOD.MODshared):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
152 case X(MOD.MODwild | MOD.MODshared, MOD.MODconst | MOD.MODshared):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
153 return 1;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
154
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
155 default:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
156 return 0;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
157 }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
158 }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
159
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
160 /*********************************
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
161 * Mangling for mod.
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
162 */
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
163 void MODtoDecoBuffer(OutBuffer buf, MOD mod)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
164 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
165 switch (mod)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
166 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
167 case MOD.MODundefined:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
168 break;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
169 case MOD.MODconst:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
170 buf.writeByte('x');
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
171 break;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
172 case MOD.MODimmutable:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
173 buf.writeByte('y');
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
174 break;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
175 case MOD.MODshared:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
176 buf.writeByte('O');
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
177 break;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
178 case MOD.MODshared | MOD.MODconst:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
179 buf.writestring("Ox");
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
180 break;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
181 case MOD.MODwild:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
182 buf.writestring("Ng");
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
183 break;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
184 case MOD.MODshared | MOD.MODwild:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
185 buf.writestring("ONg");
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
186 break;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
187 default:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
188 assert(0);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
189 }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
190 }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
191
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
192 /*********************************
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
193 * Name for mod.
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
194 */
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
195 void MODtoBuffer(OutBuffer buf, MOD mod)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
196 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
197 switch (mod)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
198 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
199 case MOD.MODundefined:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
200 break;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
201
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
202 case MOD.MODimmutable:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
203 buf.writestring(Token.tochars[TOK.TOKimmutable]);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
204 break;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
205
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
206 case MOD.MODshared:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
207 buf.writestring(Token.tochars[TOK.TOKshared]);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
208 break;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
209
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
210 case MOD.MODshared | MOD.MODconst:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
211 buf.writestring(Token.tochars[TOK.TOKshared]);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
212 buf.writeByte(' ');
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
213 case MOD.MODconst:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
214 buf.writestring(Token.tochars[TOK.TOKconst]);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
215 break;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
216
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
217 case MOD.MODshared | MOD.MODwild:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
218 buf.writestring(Token.tochars[TOK.TOKshared]);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
219 buf.writeByte(' ');
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
220 case MOD.MODwild:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
221 buf.writestring(Token.tochars[TOKwild]);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
222 break;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
223 default:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
224 assert(0);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
225 }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
226 }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
227
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
228 import dmd.TObject;
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
229
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
230 class Type : TObject
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
231 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
232 TY ty;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
233 MOD mod; // modifiers MODxxxx
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
234 /* pick this order of numbers so switch statements work better
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
235 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
236 /// #define MODconst 1 // type is const
95
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 87
diff changeset
237 /// #define MODinvariant 4 // type is immutable
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 87
diff changeset
238 /// #define MODimmutable 4 // type is immutable
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
239 /// #define MODshared 2 // type is shared
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
240 string deco;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
241
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
242 /* These are cached values that are lazily evaluated by constOf(), invariantOf(), etc.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
243 * They should not be referenced by anybody but mtype.c.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
244 * They can be null if not lazily evaluated yet.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
245 * Note that there is no "shared immutable", because that is just immutable
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
246 * Naked == no MOD bits
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
247 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
248
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
249 Type cto; // MODconst ? naked version of this type : const version
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
250 Type ito; // MODimmutable ? naked version of this type : immutable version
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
251 Type sto; // MODshared ? naked version of this type : shared mutable version
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
252 Type scto; // MODshared|MODconst ? naked version of this type : shared const version
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
253 Type wto; // MODwild ? naked version of this type : wild version
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
254 Type swto; // MODshared|MODwild ? naked version of this type : shared wild version
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
255
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
256
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
257 Type pto; // merged pointer to this type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
258 Type rto; // reference to this type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
259 Type arrayof; // array of this type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
260 TypeInfoDeclaration vtinfo; // TypeInfo object for this Type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
261
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
262 type* ctype; // for back end
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
263
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
264 static __gshared ubyte mangleChar[TY.TMAX];
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
265 static __gshared ubyte sizeTy[TY.TMAX];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
266
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
267 // These tables are for implicit conversion of binary ops;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
268 // the indices are the type of operand one, followed by operand two.
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
269 static __gshared ubyte impcnvResult[TY.TMAX][TY.TMAX] = [
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
270 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
271 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
272 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
273 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
274 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
275 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
276 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
277 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
278 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
279 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
280 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
281 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
282 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
283 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
284 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
285 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,19,19,19,19,19,20,21,22,23,24,25,23,24,25,29,30,31,37,19,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
286 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,19,19,19,19,19,20,21,22,23,24,25,23,24,25,29,30,31,37,19,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
287 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,19,19,19,19,19,20,21,22,23,24,25,23,24,25,29,30,31,37,19,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
288 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,19,19,19,19,19,20,21,22,23,24,25,23,24,25,29,30,31,37,19,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
289 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,19,19,19,19,19,20,21,22,23,24,25,23,24,25,29,30,31,37,19,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
290 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,20,20,20,20,20,20,21,22,23,24,25,23,24,25,29,30,31,37,20,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
291 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,21,21,21,21,21,21,21,22,23,24,25,23,24,25,29,30,31,37,21,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
292 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,22,22,22,22,22,22,22,22,23,24,25,23,24,25,29,30,31,37,22,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
293 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,23,23,23,23,23,23,23,23,23,24,25,23,24,25,29,30,31,37,23,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
294 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,24,24,24,24,24,24,24,24,24,24,25,24,24,25,30,30,31,37,24,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
295 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,25,25,25,25,25,25,25,25,25,25,25,25,25,25,31,31,31,37,25,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
296 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,23,23,23,23,23,23,23,23,23,24,25,26,27,28,29,30,31,37,23,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
297 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,24,24,24,24,24,24,24,24,24,24,25,27,27,28,30,30,31,37,24,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
298 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,25,25,25,25,25,25,25,25,25,25,25,28,28,28,31,31,31,37,25,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
299 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,29,29,29,29,29,29,29,29,29,30,31,29,30,31,29,30,31,37,29,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
300 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,30,30,30,30,30,30,30,30,30,30,31,30,30,31,30,30,31,37,30,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
301 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,37,31,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
302 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
303 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,19,19,19,19,19,20,21,22,23,24,25,23,24,25,29,30,31,37,33,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
304 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
305 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
306 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
307 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
308 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
309 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
310 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
311 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
312 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
313 ];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
314
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
315 static __gshared ubyte impcnvType1[TY.TMAX][TY.TMAX] = [
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
316 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
317 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
318 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
319 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
320 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
321 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
322 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
323 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
324 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
325 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
326 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
327 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
328 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
329 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
330 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
331 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,19,19,19,19,19,20,21,22,23,24,25,23,24,25,23,24,25,37,19,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
332 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,19,19,19,19,19,20,21,22,23,24,25,23,24,25,23,24,25,37,19,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
333 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,19,19,19,19,19,20,21,22,23,24,25,23,24,25,23,24,25,37,19,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
334 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,19,19,19,19,19,20,21,22,23,24,25,23,24,25,23,24,25,37,19,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
335 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,19,19,19,19,19,20,21,22,23,24,25,23,24,25,23,24,25,37,19,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
336 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,20,20,20,20,20,20,21,22,23,24,25,23,24,25,23,24,25,37,20,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
337 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,21,21,21,21,21,21,21,22,23,24,25,23,24,25,23,24,25,37,21,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
338 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,22,22,22,22,22,22,22,22,23,24,25,23,24,25,23,24,25,37,22,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
339 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,23,23,23,23,23,23,23,23,23,24,25,23,24,25,23,24,25,37,23,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
340 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,24,24,24,24,24,24,24,24,24,24,25,24,24,25,24,24,25,37,24,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
341 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,37,25,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
342 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,26,26,26,26,26,26,26,26,26,27,28,26,27,28,26,27,28,37,26,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
343 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,27,27,27,27,27,27,27,27,27,27,28,27,27,28,27,27,28,37,27,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
344 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,37,28,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
345 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,29,29,29,29,29,29,29,29,29,30,31,29,30,31,29,30,31,37,29,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
346 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,30,30,30,30,30,30,30,30,30,30,31,30,30,31,30,30,31,37,30,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
347 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,37,31,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
348 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
349 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,19,19,19,19,19,20,21,22,23,24,25,23,24,25,23,24,25,37,33,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
350 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
351 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
352 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
353 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
354 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
355 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
356 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
357 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
358 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
359 ];
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
360
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
361 static __gshared ubyte impcnvType2[TY.TMAX][TY.TMAX] = [
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
362 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
363 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
364 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
365 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
366 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
367 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
368 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
369 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
370 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
371 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
372 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
373 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
374 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
375 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
376 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
377 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,19,19,19,19,19,20,21,22,23,24,25,26,27,28,29,30,31,37,19,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
378 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,19,19,19,19,19,20,21,22,23,24,25,26,27,28,29,30,31,37,19,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
379 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,19,19,19,19,19,20,21,22,23,24,25,26,27,28,29,30,31,37,19,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
380 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,19,19,19,19,19,20,21,22,23,24,25,26,27,28,29,30,31,37,19,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
381 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,19,19,19,19,19,20,21,22,23,24,25,26,27,28,29,30,31,37,19,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
382 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,20,20,20,20,20,20,21,22,23,24,25,26,27,28,29,30,31,37,20,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
383 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,21,21,21,21,21,21,21,22,23,24,25,26,27,28,29,30,31,37,21,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
384 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,22,22,22,22,22,22,22,22,23,24,25,26,27,28,29,30,31,37,22,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
385 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,23,23,23,23,23,23,23,23,23,24,25,26,27,28,29,30,31,37,23,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
386 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,24,24,24,24,24,24,24,24,24,24,25,27,27,28,30,30,31,37,24,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
387 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,25,25,25,25,25,25,25,25,25,25,25,28,28,28,31,31,31,37,25,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
388 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,23,23,23,23,23,23,23,23,23,24,25,26,27,28,29,30,31,37,23,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
389 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,24,24,24,24,24,24,24,24,24,24,25,27,27,28,30,30,31,37,24,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
390 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,25,25,25,25,25,25,25,25,25,25,25,28,28,28,31,31,31,37,25,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
391 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,23,23,23,23,23,23,23,23,23,24,25,26,27,28,29,30,31,37,23,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
392 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,24,24,24,24,24,24,24,24,24,24,25,27,27,28,30,30,31,37,24,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
393 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,25,25,25,25,25,25,25,25,25,25,25,28,28,28,31,31,31,37,25,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
394 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
395 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,19,19,19,19,19,20,21,22,23,24,25,26,27,28,29,30,31,37,33,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
396 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
397 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
398 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
399 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
400 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
401 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
402 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
403 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
404 [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
405 ];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
406
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
407 // If !=0, give warning on implicit conversion
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
408 static __gshared const(bool) impcnvWarn[TY.TMAX][TY.TMAX] = [
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
409 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
410 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
411 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
412 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
413 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
414 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
415 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
416 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
417 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
418 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
419 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
420 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
421 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
422 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
423 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
424 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
425 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
426 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
427 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
428 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
429 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
430 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
431 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
432 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
433 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
434 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
435 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
436 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
437 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
438 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
439 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
440 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
441 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
442 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
443 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
444 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
445 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
446 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
447 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
448 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
449 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
450 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
451 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
452 ];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
453
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
454 this(TY ty)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
455 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
456 register();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
457 this.ty = ty;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
458 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
459
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
460 Type syntaxCopy()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
461 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
462 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
463 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
464
45
ccbc1e0bb3f0 StringExp.equals implemented
korDen
parents: 23
diff changeset
465 bool equals(Object o)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
466 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
467 Type t = cast(Type)o;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
468 //printf("Type.equals(%s, %s)\n", toChars(), t.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
469 if (this is o || (t && deco == t.deco) && // deco strings are unique
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
470 deco !is null) // and semantic() has been run
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
471 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
472 //printf("deco = '%s', t.deco = '%s'\n", deco, t.deco);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
473 return 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
474 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
475 //if (deco && t && t.deco) printf("deco = '%s', t.deco = '%s'\n", deco, t.deco);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
476 return 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
477 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
478
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
479 DYNCAST dyncast() { return DYNCAST.DYNCAST_TYPE; } // kludge for template.isType()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
480
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
481 /*******************************
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
482 * Covariant means that 'this' can substitute for 't',
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
483 * i.e. a pure function is a match for an impure type. * Returns:
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
484 * 0 types are distinct
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
485 * 1 this is covariant with t
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
486 * 2 arguments match as far as overloading goes,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
487 * but types are not covariant
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
488 * 3 cannot determine covariance because of forward references
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
489 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
490 int covariant(Type t)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
491 {
79
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
492 static if (false)
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
493 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
494 printf("Type.covariant(t = %s) %s\n", t.toChars(), toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
495 printf("deco = %p, %p\n", deco, t.deco);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
496 // printf("ty = %d\n", next.ty);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
497 printf("mod = %x, %x\n", mod, t.mod);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
498 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
499
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
500 int inoutmismatch = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
501
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
502 TypeFunction t1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
503 TypeFunction t2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
504
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
505 if (equals(t))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
506 return 1; // covariant
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
507
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
508 if (ty != TY.Tfunction || t.ty != TY.Tfunction)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
509 goto Ldistinct;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
510
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
511 t1 = cast(TypeFunction)this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
512 t2 = cast(TypeFunction)t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
513
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
514 if (t1.varargs != t2.varargs)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
515 goto Ldistinct;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
516
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
517 if (t1.parameters && t2.parameters)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
518 {
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
519 size_t dim = Parameter.dim(t1.parameters);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
520 if (dim != Parameter.dim(t2.parameters))
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
521 goto Ldistinct;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
522
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
523 for (size_t i = 0; i < dim; i++)
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
524 {
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
525 auto arg1 = Parameter.getNth(t1.parameters, i);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
526 auto arg2 = Parameter.getNth(t2.parameters, i);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
527
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
528 if (!arg1.type.equals(arg2.type))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
529 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
530 ///static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
531 /// // turn on this for contravariant argument types, see bugzilla 3075
98
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
532 /// // BUG: cannot convert ref to const to ref to immutable
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
533 /// // We can add const, but not subtract it
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
534 /// if (arg2.type.implicitConvTo(arg1.type) < MATCH.MATCHconst)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
535 ///}
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
536 goto Ldistinct;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
537 }
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
538 const StorageClass sc = STC.STCref | STC.STCin | STC.STCout | STC.STClazy;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
539 if ((arg1.storageClass & sc) != (arg2.storageClass & sc))
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
540 inoutmismatch = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
541 // We can add scope, but not subtract it
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
542 if (!(arg1.storageClass & STC.STCscope) && (arg2.storageClass & STC.STCscope))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
543 inoutmismatch = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
544 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
545 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
546 else if (t1.parameters != t2.parameters)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
547 goto Ldistinct;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
548
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
549 // The argument lists match
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
550 if (inoutmismatch)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
551 goto Lnotcovariant;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
552 if (t1.linkage != t2.linkage)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
553 goto Lnotcovariant;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
554
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
555 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
556 // Return types
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
557 Type t1n = t1.next;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
558 Type t2n = t2.next;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
559
79
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
560 if (t1n is null || t2n is null) // happens with return type inference
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
561 goto Lnotcovariant;
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
562
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
563 if (t1n.equals(t2n))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
564 goto Lcovariant;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
565 if (t1n.ty == TY.Tclass && t2n.ty == TY.Tclass)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
566 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
567 /* If same class type, but t2n is const, then it's
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
568 * covariant. Do this test first because it can work on
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
569 * forward references.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
570 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
571 if ((cast(TypeClass)t1n).sym == (cast(TypeClass)t2n).sym &&
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
572 MODimplicitConv(t1n.mod, t2n.mod))
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
573 goto Lcovariant;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
574
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
575 // If t1n is forward referenced:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
576 ClassDeclaration cd = (cast(TypeClass)t1n).sym;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
577 if (!cd.baseClass && cd.baseclasses.dim && !cd.isInterfaceDeclaration())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
578 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
579 return 3;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
580 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
581 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
582 if (t1n.implicitConvTo(t2n))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
583 goto Lcovariant;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
584 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
585
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
586 goto Lnotcovariant;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
587
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
588 Lcovariant:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
589 /* Can convert mutable to const
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
590 */
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
591 if (!MODimplicitConv(t2.mod, t1.mod))
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
592 goto Lnotcovariant;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
593 static if(false) {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
594 if (t1.mod != t2.mod)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
595 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
596 if (!(t1.mod & MOD.MODconst) && (t2.mod & MOD.MODconst))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
597 goto Lnotcovariant;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
598 if (!(t1.mod & MOD.MODshared) && (t2.mod & MOD.MODshared))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
599 goto Lnotcovariant;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
600 }
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
601 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
602 /* Can convert pure to impure, and nothrow to throw
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
603 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
604 if (!t1.ispure && t2.ispure)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
605 goto Lnotcovariant;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
606
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
607 if (!t1.isnothrow && t2.isnothrow)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
608 goto Lnotcovariant;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
609
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
610 if (t1.isref != t2.isref)
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
611 goto Lnotcovariant;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
612
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
613 /* Can convert safe/trusted to system
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
614 */
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
615 if (t1.trust <= TRUST.TRUSTsystem && t2.trust >= TRUST.TRUSTtrusted)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
616 goto Lnotcovariant;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
617
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
618 //printf("\tcovaraint: 1\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
619 return 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
620
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
621 Ldistinct:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
622 //printf("\tcovaraint: 0\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
623 return 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
624
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
625 Lnotcovariant:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
626 //printf("\tcovaraint: 2\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
627 return 2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
628 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
629
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
630 string toChars()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
631 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
632 scope OutBuffer buf = new OutBuffer();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
633
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
634 HdrGenState hgs;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
635 toCBuffer(buf, null, &hgs);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
636 return buf.toChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
637 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
638
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
639 static char needThisPrefix()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
640 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
641 return 'M'; // name mangling prefix for functions needing 'this'
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
642 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
643
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
644 static void init()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
645 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
646 Lexer.initKeywords();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
647
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
648 for (int i = 0; i < TY.TMAX; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
649 sizeTy[i] = TypeBasic.sizeof;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
650
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
651 sizeTy[TY.Tsarray] = TypeSArray.sizeof;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
652 sizeTy[TY.Tarray] = TypeDArray.sizeof;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
653 //sizeTy[TY.Tnarray] = TypeNArray.sizeof;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
654 sizeTy[TY.Taarray] = TypeAArray.sizeof;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
655 sizeTy[TY.Tpointer] = TypePointer.sizeof;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
656 sizeTy[TY.Treference] = TypeReference.sizeof;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
657 sizeTy[TY.Tfunction] = TypeFunction.sizeof;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
658 sizeTy[TY.Tdelegate] = TypeDelegate.sizeof;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
659 sizeTy[TY.Tident] = TypeIdentifier.sizeof;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
660 sizeTy[TY.Tinstance] = TypeInstance.sizeof;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
661 sizeTy[TY.Ttypeof] = TypeTypeof.sizeof;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
662 sizeTy[TY.Tenum] = TypeEnum.sizeof;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
663 sizeTy[TY.Ttypedef] = TypeTypedef.sizeof;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
664 sizeTy[TY.Tstruct] = TypeStruct.sizeof;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
665 sizeTy[TY.Tclass] = TypeClass.sizeof;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
666 sizeTy[TY.Ttuple] = TypeTuple.sizeof;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
667 sizeTy[TY.Tslice] = TypeSlice.sizeof;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
668 sizeTy[TY.Treturn] = TypeReturn.sizeof;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
669
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
670 mangleChar[TY.Tarray] = 'A';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
671 mangleChar[TY.Tsarray] = 'G';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
672 mangleChar[TY.Tnarray] = '@';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
673 mangleChar[TY.Taarray] = 'H';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
674 mangleChar[TY.Tpointer] = 'P';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
675 mangleChar[TY.Treference] = 'R';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
676 mangleChar[TY.Tfunction] = 'F';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
677 mangleChar[TY.Tident] = 'I';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
678 mangleChar[TY.Tclass] = 'C';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
679 mangleChar[TY.Tstruct] = 'S';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
680 mangleChar[TY.Tenum] = 'E';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
681 mangleChar[TY.Ttypedef] = 'T';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
682 mangleChar[TY.Tdelegate] = 'D';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
683
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
684 mangleChar[TY.Tnone] = 'n';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
685 mangleChar[TY.Tvoid] = 'v';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
686 mangleChar[TY.Tint8] = 'g';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
687 mangleChar[TY.Tuns8] = 'h';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
688 mangleChar[TY.Tint16] = 's';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
689 mangleChar[TY.Tuns16] = 't';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
690 mangleChar[TY.Tint32] = 'i';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
691 mangleChar[TY.Tuns32] = 'k';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
692 mangleChar[TY.Tint64] = 'l';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
693 mangleChar[TY.Tuns64] = 'm';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
694 mangleChar[TY.Tfloat32] = 'f';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
695 mangleChar[TY.Tfloat64] = 'd';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
696 mangleChar[TY.Tfloat80] = 'e';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
697
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
698 mangleChar[TY.Timaginary32] = 'o';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
699 mangleChar[TY.Timaginary64] = 'p';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
700 mangleChar[TY.Timaginary80] = 'j';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
701 mangleChar[TY.Tcomplex32] = 'q';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
702 mangleChar[TY.Tcomplex64] = 'r';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
703 mangleChar[TY.Tcomplex80] = 'c';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
704
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
705 mangleChar[TY.Tbool] = 'b';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
706 mangleChar[TY.Tascii] = 'a';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
707 mangleChar[TY.Twchar] = 'u';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
708 mangleChar[TY.Tdchar] = 'w';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
709
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
710 // '@' shouldn't appear anywhere in the deco'd names
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
711 mangleChar[TY.Tbit] = '@';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
712 mangleChar[TY.Tinstance] = '@';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
713 mangleChar[TY.Terror] = '@';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
714 mangleChar[TY.Ttypeof] = '@';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
715 mangleChar[TY.Ttuple] = 'B';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
716 mangleChar[TY.Tslice] = '@';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
717 mangleChar[TY.Treturn] = '@';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
718
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
719 debug {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
720 for (int i = 0; i < TY.TMAX; i++) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
721 if (!mangleChar[i]) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
722 writef("ty = %d\n", i);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
723 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
724 assert(mangleChar[i]);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
725 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
726 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
727 // Set basic types
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
728 enum TY[] basetab = [
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
729 TY.Tvoid, TY.Tint8, TY.Tuns8, TY.Tint16, TY.Tuns16, TY.Tint32, TY.Tuns32, TY.Tint64, TY.Tuns64,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
730 TY.Tfloat32, TY.Tfloat64, TY.Tfloat80,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
731 TY.Timaginary32, TY.Timaginary64, TY.Timaginary80,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
732 TY.Tcomplex32, TY.Tcomplex64, TY.Tcomplex80,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
733 TY.Tbool,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
734 TY.Tascii, TY.Twchar, TY.Tdchar
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
735 ];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
736
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
737 foreach (bt; basetab) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
738 Type t = new TypeBasic(bt);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
739 t = t.merge();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
740 basic[bt] = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
741 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
742
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
743 basic[TY.Terror] = basic[TY.Tint32];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
744
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
745 global.tvoidptr = tvoid.pointerTo();
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
746 global.tstring = tchar.invariantOf().arrayOf();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
747
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
748 if (global.params.isX86_64) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
749 PTRSIZE = 8;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
750 if (global.params.isLinux || global.params.isFreeBSD || global.params.isSolaris)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
751 REALSIZE = 10;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
752 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
753 REALSIZE = 8;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
754 Tsize_t = TY.Tuns64;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
755 Tptrdiff_t = TY.Tint64;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
756 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
757 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
758 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
759 PTRSIZE = 4;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
760 version (TARGET_OSX) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
761 REALSIZE = 16;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
762 REALPAD = 6;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
763 } else version (XXX) { //#elif TARGET_LINUX || TARGET_FREEBSD || TARGET_SOLARIS
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
764 REALSIZE = 12;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
765 REALPAD = 2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
766 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
767 REALSIZE = 10;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
768 REALPAD = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
769 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
770 Tsize_t = TY.Tuns32;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
771 Tptrdiff_t = TY.Tint32;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
772 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
773 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
774
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
775 ulong size()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
776 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
777 return size(Loc(0));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
778 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
779
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
780 ulong size(Loc loc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
781 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
782 error(loc, "no size for type %s", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
783 return 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
784 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
785
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
786 uint alignsize()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
787 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
788 return cast(uint)size(Loc(0)); ///
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
789 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
790
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
791 Type semantic(Loc loc, Scope sc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
792 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
793 return merge();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
794 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
795
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
796 Type trySemantic(Loc loc, Scope sc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
797 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
798 uint errors = global.errors;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
799 global.gag++; // suppress printing of error messages
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
800 Type t = semantic(loc, sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
801 global.gag--;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
802 if (errors != global.errors) // if any errors happened
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
803 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
804 global.errors = errors;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
805 t = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
806 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
807 return t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
808 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
809
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
810 /********************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
811 * Name mangling.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
812 * Input:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
813 * flag 0x100 do not do const/invariant
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
814 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
815 void toDecoBuffer(OutBuffer buf, int flag = 0)
20
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
816 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
817 if (flag != mod && flag != 0x100)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
818 {
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
819 MODtoDecoBuffer(buf, mod);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
820 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
821 buf.writeByte(mangleChar[ty]);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
822 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
823
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
824 Type merge()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
825 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
826 Type t = this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
827 assert(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
828
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
829 //printf("merge(%s)\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
830 if (deco is null)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
831 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
832 OutBuffer buf = new OutBuffer();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
833
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
834 //if (next)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
835 //next = next.merge();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
836 toDecoBuffer(buf);
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
837 auto s = buf.extractString();
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
838 Object* sv = global.type_stringtable.update(s);
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
839 if (*sv)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
840 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
841 t = cast(Type) *sv;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
842 debug {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
843 if (!t.deco)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
844 writef("t = %s\n", t.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
845 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
846 assert(t.deco);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
847 //printf("old value, deco = '%s' %p\n", t.deco, t.deco);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
848 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
849 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
850 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
851 *sv = this;
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
852 deco = s;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
853 //printf("new value, deco = '%s' %p\n", t.deco, t.deco);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
854 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
855 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
856 return t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
857 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
858
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
859 /*************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
860 * This version does a merge even if the deco is already computed.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
861 * Necessary for types that have a deco, but are not merged.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
862 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
863 Type merge2()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
864 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
865 //printf("merge2(%s)\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
866 Type t = this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
867 assert(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
868 if (!t.deco)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
869 return t.merge();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
870
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
871 Object* sv = global.type_stringtable.lookup(t.deco);
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
872 if (sv && *sv)
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
873 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
874 t = cast(Type)*sv;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
875 assert(t.deco);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
876 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
877 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
878 assert(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
879
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
880 return t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
881 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
882
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
883 void toCBuffer(OutBuffer buf, Identifier ident, HdrGenState* hgs)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
884 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
885 toCBuffer2(buf, hgs, MOD.MODundefined);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
886 if (ident)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
887 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
888 buf.writeByte(' ');
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
889 buf.writestring(ident.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
890 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
891 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
892
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
893 void toCBuffer2(OutBuffer buf, HdrGenState* hgs, MOD mod)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
894 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
895 if (mod != this.mod)
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
896 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
897 toCBuffer3(buf, hgs, mod);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
898 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
899 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
900 buf.writestring(toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
901 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
902
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
903 void toCBuffer3(OutBuffer buf, HdrGenState* hgs, MOD mod)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
904 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
905 if (mod != this.mod)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
906 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
907 if (this.mod & MOD.MODshared)
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
908 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
909 MODtoBuffer(buf, this.mod & MOD.MODshared);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
910 buf.writeByte('(');
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
911 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
912
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
913 if (this.mod & ~MOD.MODshared)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
914 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
915 MODtoBuffer(buf, this.mod & ~MOD.MODshared);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
916 buf.writeByte('(');
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
917 toCBuffer2(buf, hgs, this.mod);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
918 buf.writeByte(')');
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
919 }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
920 else
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
921 toCBuffer2(buf, hgs, this.mod);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
922 if (this.mod & MOD.MODshared)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
923 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
924 buf.writeByte(')');
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
925 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
926 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
927 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
928
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
929 void modToBuffer(OutBuffer buf)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
930 {
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
931 if (mod)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
932 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
933 buf.writeByte(' ');
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
934 MODtoBuffer(buf, mod);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
935 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
936 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
937
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
938 version (CPP_MANGLE) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
939 void toCppMangle(OutBuffer buf, CppMangleState* cms)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
940 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
941 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
942 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
943 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
944 bool isintegral()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
945 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
946 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
947 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
948
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
949 bool isfloating() // real, imaginary, or complex
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
950 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
951 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
952 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
953
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
954 bool isreal()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
955 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
956 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
957 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
958
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
959 bool isimaginary()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
960 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
961 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
962 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
963
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
964 bool iscomplex()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
965 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
966 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
967 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
968
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
969 bool isscalar()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
970 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
971 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
972 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
973
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
974 bool isunsigned()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
975 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
976 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
977 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
978
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
979 bool isauto()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
980 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
981 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
982 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
983
12
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 4
diff changeset
984 bool isString()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
985 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
986 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
987 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
988
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
989 /**************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
990 * Given:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
991 * T a, b;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
992 * Can we assign:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
993 * a = b;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
994 * ?
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
995 */
73
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 53
diff changeset
996 bool isAssignable()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
997 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
998 return true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
999 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1000
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1001 bool checkBoolean() // if can be converted to boolean value
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1002 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1003 return isscalar();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1004 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1005
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1006 /*********************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1007 * Check type to see if it is based on a deprecated symbol.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1008 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1009 void checkDeprecated(Loc loc, Scope sc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1010 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1011 Dsymbol s = toDsymbol(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1012 if (s)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1013 s.checkDeprecated(loc, sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1014 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1015
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1016 bool isConst() { return (mod & MOD.MODconst) != 0; }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1017
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1018 int isImmutable() { return mod & MOD.MODimmutable; }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1019
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1020 int isMutable() { return !(mod & (MOD.MODconst | MOD.MODimmutable | MOD.MODwild)); }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1021
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1022 int isShared() { return mod & MOD.MODshared; }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1023
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1024 int isSharedConst() { return mod == (MOD.MODshared | MOD.MODconst); }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1025
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1026 int isWild() { return mod & MOD.MODwild; }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1027
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1028 int isSharedWild() { return mod == (MOD.MODshared | MOD.MODwild); }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1029
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1030 int isNaked() { return mod == 0; }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1031
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1032
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1033 /********************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1034 * Convert to 'const'.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1035 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1036 Type constOf()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1037 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1038 //printf("Type.constOf() %p %s\n", this, toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1039 if (mod == MOD.MODconst)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1040 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1041 if (cto)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1042 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1043 assert(cto.mod == MOD.MODconst);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1044 return cto;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1045 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1046 Type t = makeConst();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1047 t = t.merge();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1048 t.fixTo(this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1049 //printf("-Type.constOf() %p %s\n", t, toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1050 return t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1051 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1052
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1053 /********************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1054 * Convert to 'immutable'.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1055 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1056 Type invariantOf()
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1057 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1058 //printf("Type.invariantOf() %p %s\n", this, toChars());
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1059 if (isImmutable())
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1060 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1061 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1062 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1063 if (ito)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1064 {
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1065 assert(ito.isImmutable());
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1066 return ito;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1067 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1068 Type t = makeInvariant();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1069 t = t.merge();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1070 t.fixTo(this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1071 //printf("\t%p\n", t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1072 return t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1073 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1074
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1075 Type mutableOf()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1076 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1077 //printf("Type.mutableOf() %p, %s\n", this, toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1078 Type t = this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1079 if (isConst())
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1080 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1081 if (isShared())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1082 t = sto; // shared const => shared
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1083 else
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1084 t = cto; // const => naked
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1085 assert(!t || t.isMutable());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1086 }
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1087 else if (isImmutable())
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1088 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1089 t = ito;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1090 assert(!t || (t.isMutable() && !t.isShared()));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1091 }
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1092 else if (isWild())
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1093 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1094 if (isShared())
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1095 t = sto; // shared wild => shared
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1096 else
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1097 t = wto; // wild => naked
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1098 assert(!t || t.isMutable());
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1099 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1100 if (!t)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1101 {
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1102 t = makeMutable();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1103 t = t.merge();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1104 t.fixTo(this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1105 }
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1106 assert(t.isMutable());
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1107 return t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1108 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1109
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1110 Type sharedOf()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1111 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1112 //printf("Type.sharedOf() %p, %s\n", this, toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1113 if (mod == MOD.MODshared)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1114 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1115 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1116 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1117 if (sto)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1118 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1119 assert(sto.isShared());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1120 return sto;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1121 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1122
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1123 Type t = makeShared();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1124 t = t.merge();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1125 t.fixTo(this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1126
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1127 //printf("\t%p\n", t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1128 return t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1129 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1130
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1131 Type sharedConstOf()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1132 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1133 //printf("Type.sharedConstOf() %p, %s\n", this, toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1134 if (mod == (MODshared | MODconst))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1135 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1136 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1137 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1138 if (scto)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1139 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1140 assert(scto.mod == (MODshared | MODconst));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1141 return scto;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1142 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1143
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1144 Type t = makeSharedConst();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1145 t = t.merge();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1146 t.fixTo(this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1147 //printf("\t%p\n", t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1148
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1149 return t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1150 }
98
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1151
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1152 /********************************
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1153 * Make type unshared.
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1154 * 0 => 0
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1155 * const => const
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1156 * immutable => immutable
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1157 * shared => 0
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1158 * shared const => const
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1159 * wild => wild
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1160 * shared wild => wild
98
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1161 */
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1162 Type unSharedOf()
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1163 {
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1164 //writef("Type::unSharedOf() %p, %s\n", this, toChars());
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1165 Type t = this;
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1166
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1167 if (isShared())
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1168 {
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1169 if (isConst())
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1170 t = cto; // shared const => const
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1171 else if (isWild())
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1172 t = wto; // shared wild => wild
98
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1173 else
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1174 t = sto;
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1175 assert(!t || !t.isShared());
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1176 }
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1177
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1178 if (!t)
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1179 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
1180 t = cloneThis(this);
98
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1181 t.mod = mod & ~MODshared;
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1182 t.deco = null;
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1183 t.arrayof = null;
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1184 t.pto = null;
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1185 t.rto = null;
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1186 t.cto = null;
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1187 t.ito = null;
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1188 t.sto = null;
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1189 t.scto = null;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1190 t.wto = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1191 t.swto = null;
98
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1192 t.vtinfo = null;
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1193 t = t.merge();
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1194
98
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1195 t.fixTo(this);
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1196 }
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1197 assert(!t.isShared());
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1198 return t;
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1199 }
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
1200
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1201
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1202 /********************************
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1203 * Convert to 'wild'.
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1204 */
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1205
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1206 Type wildOf()
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1207 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1208 //printf("Type::wildOf() %p %s\n", this, toChars());
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1209 if (mod == MOD.MODwild)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1210 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1211 return this;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1212 }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1213 if (wto)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1214 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1215 assert(wto.isWild());
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1216 return wto;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1217 }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1218 Type t = makeWild();
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1219 t = t.merge();
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1220 t.fixTo(this);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1221 //printf("\t%p %s\n", t, t->toChars());
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1222 return t;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1223 }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1224
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1225 Type sharedWildOf()
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1226 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1227 //printf("Type::sharedWildOf() %p, %s\n", this, toChars());
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1228 if (mod == (MOD.MODwild))
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1229 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1230 return this;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1231 }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1232 if (swto)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1233 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1234 assert(swto.mod == (MOD.MODshared | MOD.MODwild));
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1235 return swto;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1236 }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1237 Type t = makeSharedWild();
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1238 t = t.merge();
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1239 t.fixTo(this);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1240 //printf("\t%p\n", t);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1241 return t;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1242 }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1243
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1244 static uint X(MOD m, MOD n)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1245 {
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1246 return (((m) << 4) | (n));
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1247 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1248
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1249 /**********************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1250 * For our new type 'this', which is type-constructed from t,
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1251 * fill in the cto, ito, sto, scto, wto shortcuts.
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1252 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1253 void fixTo(Type t)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1254 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1255 ito = t.ito;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1256 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1257 /* Cannot do these because these are not fully transitive:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1258 * there can be a shared ptr to immutable, for example.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1259 * Immutable subtypes are always immutable, though.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1260 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1261 cto = t.cto;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1262 sto = t.sto;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1263 scto = t.scto;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1264 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1265
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1266 assert(mod != t.mod);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1267
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1268 switch (X(mod, t.mod))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1269 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1270 case X(MOD.MODundefined, MOD.MODconst):
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1271 cto = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1272 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1273
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1274 case X(MOD.MODundefined, MOD.MODimmutable):
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1275 ito = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1276 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1277
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1278 case X(MOD.MODundefined, MOD.MODshared):
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1279 sto = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1280 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1281
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1282 case X(MOD.MODundefined, MOD.MODshared | MOD.MODconst):
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1283 scto = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1284 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1285
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1286 case X(MOD.MODundefined, MODwild):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1287 wto = t;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1288 break;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1289
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1290 case X(MOD.MODundefined, MODshared | MODwild):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1291 swto = t;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1292 break;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1293
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1294
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1295 case X(MOD.MODconst, MOD.MODundefined):
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1296 cto = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1297 goto L2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1298
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1299 case X(MOD.MODconst, MOD.MODimmutable):
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1300 ito = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1301 goto L2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1302
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1303 case X(MOD.MODconst, MOD.MODshared):
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1304 sto = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1305 goto L2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1306
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1307 case X(MOD.MODconst, MOD.MODshared | MOD.MODconst):
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1308 scto = t;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1309 goto L2;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1310
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1311 case X(MOD.MODconst, MOD.MODwild):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1312 wto = t;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1313 goto L2;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1314
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1315 case X(MOD.MODconst, MOD.MODshared | MOD.MODwild):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1316 swto = t;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1317 L2:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1318 t.cto = this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1319 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1320
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1321
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1322 case X(MOD.MODimmutable, MOD.MODundefined):
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1323 ito = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1324 goto L3;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1325
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1326 case X(MOD.MODimmutable, MOD.MODconst):
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1327 cto = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1328 goto L3;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1329
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1330 case X(MOD.MODimmutable, MOD.MODshared):
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1331 sto = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1332 goto L3;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1333
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1334 case X(MOD.MODimmutable, MOD.MODshared | MOD.MODconst):
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1335 scto = t;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1336 goto L3;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1337
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1338 case X(MOD.MODimmutable, MOD.MODwild):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1339 wto = t;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1340 goto L3;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1341
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1342 case X(MOD.MODimmutable, MOD.MODshared | MOD.MODwild):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1343 swto = t;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1344 L3:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1345 t.ito = this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1346 if (t.cto) t.cto.ito = this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1347 if (t.sto) t.sto.ito = this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1348 if (t.scto) t.scto.ito = this;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1349 if (t.wto) t.wto.ito = this;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1350 if (t.swto) t.swto.ito = this;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1351 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1352
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1353
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1354 case X(MOD.MODshared, MOD.MODundefined):
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1355 sto = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1356 goto L4;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1357
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1358 case X(MOD.MODshared, MOD.MODconst):
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1359 cto = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1360 goto L4;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1361
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1362 case X(MOD.MODshared, MOD.MODimmutable):
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1363 ito = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1364 goto L4;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1365
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1366 case X(MOD.MODshared, MOD.MODshared | MOD.MODconst):
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1367 scto = t;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1368 goto L4;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1369
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1370 case X(MOD.MODshared, MOD.MODwild):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1371 wto = t;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1372 goto L4;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1373
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1374 case X(MOD.MODshared, MOD.MODshared | MOD.MODwild):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1375 swto = t;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1376 L4:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1377 t.sto = this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1378 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1379
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1380
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1381 case X(MOD.MODshared | MOD.MODconst, MOD.MODundefined):
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1382 scto = null;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1383 goto L5;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1384
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1385 case X(MOD.MODshared | MOD.MODconst, MOD.MODconst):
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1386 cto = t;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1387 goto L5;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1388
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1389 case X(MOD.MODshared | MOD.MODconst, MOD.MODimmutable):
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1390 ito = t;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1391 goto L5;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1392
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1393 case X(MOD.MODshared | MOD.MODconst, MOD.MODwild):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1394 wto = t;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1395 goto L5;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1396
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1397 case X(MOD.MODshared | MOD.MODconst, MOD.MODshared):
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1398 sto = t;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1399 goto L5;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1400
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1401 case X(MOD.MODshared | MOD.MODconst, MOD.MODshared | MOD.MODwild):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1402 swto = t;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1403 L5:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1404 t.scto = this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1405 break;
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1406
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1407 case X(MOD.MODwild, MOD.MODundefined):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1408 wto = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1409 goto L6;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1410
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1411 case X(MOD.MODwild, MOD.MODconst):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1412 cto = t;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1413 goto L6;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1414
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1415 case X(MOD.MODwild, MOD.MODimmutable):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1416 ito = t;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1417 goto L6;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1418
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1419 case X(MOD.MODwild, MOD.MODshared):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1420 sto = t;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1421 goto L6;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1422
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1423 case X(MOD.MODwild, MOD.MODshared | MOD.MODconst):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1424 scto = t;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1425 goto L6;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1426
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1427 case X(MOD.MODwild, MOD.MODshared | MOD.MODwild):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1428 swto = t;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1429 L6:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1430 t.wto = this;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1431 break;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1432
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1433
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1434 case X(MOD.MODshared | MOD.MODwild, MOD.MODundefined):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1435 swto = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1436 goto L7;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1437
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1438 case X(MOD.MODshared | MOD.MODwild, MOD.MODconst):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1439 cto = t;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1440 goto L7;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1441
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1442 case X(MOD.MODshared | MOD.MODwild, MOD.MODimmutable):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1443 ito = t;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1444 goto L7;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1445
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1446 case X(MOD.MODshared | MOD.MODwild, MOD.MODshared):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1447 sto = t;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1448 goto L7;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1449
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1450 case X(MOD.MODshared | MOD.MODwild, MOD.MODshared | MOD.MODconst):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1451 scto = t;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1452 goto L7;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1453
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1454 case X(MOD.MODshared | MOD.MODwild, MOD.MODwild):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1455 wto = t;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1456 L7:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1457 t.swto = this;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1458 break;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1459 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1460
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1461 check();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1462 t.check();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1463 //printf("fixTo: %s, %s\n", toChars(), t.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1464 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1465
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1466 /***************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1467 * Look for bugs in constructing types.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1468 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1469 void check()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1470 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1471 switch (mod)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1472 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1473 case MOD.MODundefined:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1474 if (cto) assert(cto.mod == MOD.MODconst);
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1475 if (ito) assert(ito.mod == MOD.MODimmutable);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1476 if (sto) assert(sto.mod == MOD.MODshared);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1477 if (scto) assert(scto.mod == (MOD.MODshared | MOD.MODconst));
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1478 if (wto) assert(wto.mod == MOD.MODwild);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1479 if (swto) assert(swto.mod == (MOD.MODshared | MOD.MODwild));
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1480 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1481
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1482 case MOD.MODconst:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1483 if (cto) assert(cto.mod == MOD.MODundefined);
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1484 if (ito) assert(ito.mod == MOD.MODimmutable);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1485 if (sto) assert(sto.mod == MOD.MODshared);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1486 if (scto) assert(scto.mod == (MOD.MODshared | MOD.MODconst));
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1487 if (wto) assert(wto.mod == MOD.MODwild);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1488 if (swto) assert(swto.mod == (MOD.MODshared | MOD.MODwild));
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1489 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1490
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1491 case MOD.MODimmutable:
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1492 if (cto) assert(cto.mod == MOD.MODconst);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1493 if (ito) assert(ito.mod == MOD.MODundefined);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1494 if (sto) assert(sto.mod == MOD.MODshared);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1495 if (scto) assert(scto.mod == (MOD.MODshared | MOD.MODconst));
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1496 if (wto) assert(wto.mod == MOD.MODwild);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1497 if (swto) assert(swto.mod == (MOD.MODshared | MOD.MODwild));
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1498 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1499
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1500 case MOD.MODshared:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1501 if (cto) assert(cto.mod == MOD.MODconst);
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1502 if (ito) assert(ito.mod == MOD.MODimmutable);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1503 if (sto) assert(sto.mod == MOD.MODundefined);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1504 if (scto) assert(scto.mod == (MOD.MODshared | MOD.MODconst));
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1505 if (wto) assert(wto.mod == MOD.MODwild);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1506 if (swto) assert(swto.mod == (MOD.MODshared | MOD.MODwild));
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1507 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1508
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1509 case MOD.MODshared | MOD.MODconst:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1510 if (cto) assert(cto.mod == MOD.MODconst);
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1511 if (ito) assert(ito.mod == MOD.MODimmutable);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1512 if (sto) assert(sto.mod == MOD.MODshared);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1513 if (scto) assert(scto.mod == MOD.MODundefined);
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1514 if (wto) assert(wto.mod == MOD.MODwild);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1515 if (swto) assert(swto.mod == (MOD.MODshared | MOD.MODwild));
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1516 break;
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1517
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1518 case MOD.MODwild:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1519 if (cto) assert(cto.mod == MOD.MODconst);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1520 if (ito) assert(ito.mod == MOD.MODimmutable);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1521 if (sto) assert(sto.mod == MOD.MODshared);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1522 if (scto) assert(scto.mod == (MOD.MODshared | MOD.MODconst));
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1523 if (wto) assert(wto.mod == MOD.MODundefined);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1524 if (swto) assert(swto.mod == (MOD.MODshared | MOD.MODwild));
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1525 break;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1526
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1527 case MOD.MODshared | MOD.MODwild:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1528 if (cto) assert(cto.mod == MOD.MODconst);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1529 if (ito) assert(ito.mod == MOD.MODimmutable);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1530 if (sto) assert(sto.mod == MOD.MODshared);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1531 if (scto) assert(scto.mod == (MOD.MODshared | MOD.MODconst));
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1532 if (wto) assert(wto.mod == MOD.MODwild);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1533 if (swto) assert(swto.mod == MOD.MODundefined);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1534 break;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1535 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1536
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1537 Type tn = nextOf();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1538 if (tn && ty != TY.Tfunction && ty != TY.Tdelegate)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1539 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1540 // Verify transitivity
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1541 switch (mod)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1542 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1543 case MOD.MODundefined:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1544 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1545
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1546 case MOD.MODconst:
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1547 assert(tn.mod & MOD.MODimmutable || tn.mod & MOD.MODconst);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1548 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1549
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1550 case MOD.MODimmutable:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1551 assert(tn.mod == MOD.MODimmutable);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1552 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1553
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1554 case MOD.MODshared:
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1555 assert(tn.mod & MOD.MODimmutable || tn.mod & MOD.MODshared);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1556 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1557
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1558 case MOD.MODshared | MOD.MODconst:
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1559 assert(tn.mod & MOD.MODimmutable || tn.mod & (MOD.MODshared | MOD.MODconst));
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1560 break;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1561
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1562 case MOD.MODwild:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1563 assert(tn.mod);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1564 break;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1565
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1566 case MOD.MODshared | MOD.MODwild:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1567 assert(tn.mod == MOD.MODimmutable || tn.mod == (MOD.MODshared | MOD.MODconst) || tn.mod == (MOD.MODshared | MOD.MODwild));
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1568 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1569 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1570 tn.check();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1571 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1572 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1573
51
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 45
diff changeset
1574 /************************************
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 45
diff changeset
1575 * Apply MODxxxx bits to existing type.
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 45
diff changeset
1576 */
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1577 Type castMod(uint mod)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1578 {
51
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 45
diff changeset
1579 Type t;
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 45
diff changeset
1580
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 45
diff changeset
1581 switch (mod)
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 45
diff changeset
1582 {
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 45
diff changeset
1583 case 0:
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1584 t = unSharedOf().mutableOf();
51
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 45
diff changeset
1585 break;
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 45
diff changeset
1586
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 45
diff changeset
1587 case MODconst:
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1588 t = unSharedOf().constOf();
51
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 45
diff changeset
1589 break;
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 45
diff changeset
1590
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1591 case MODimmutable:
51
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 45
diff changeset
1592 t = invariantOf();
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 45
diff changeset
1593 break;
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 45
diff changeset
1594
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 45
diff changeset
1595 case MODshared:
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1596 t = mutableOf().sharedOf();
51
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 45
diff changeset
1597 break;
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 45
diff changeset
1598
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 45
diff changeset
1599 case MODshared | MODconst:
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 45
diff changeset
1600 t = sharedConstOf();
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1601 break;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1602
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1603 case MODwild:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1604 t = unSharedOf().wildOf();
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1605 break;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1606
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1607 case MODshared | MODwild:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1608 t = sharedWildOf();
51
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 45
diff changeset
1609 break;
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 45
diff changeset
1610
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 45
diff changeset
1611 default:
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 45
diff changeset
1612 assert(0);
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 45
diff changeset
1613 }
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 45
diff changeset
1614 return t;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1615 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1616
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1617 /************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1618 * Add MODxxxx bits to existing type.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1619 * We're adding, not replacing, so adding const to
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1620 * a shared type => "shared const"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1621 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1622 Type addMod(MOD mod)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1623 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1624 Type t = this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1625
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1626 /* Add anything to immutable, and it remains immutable
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1627 */
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1628 //printf("addMod(%x) %s\n", mod, toChars());
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1629 if (!t.isImmutable())
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1630 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1631 switch (mod)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1632 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1633 case MOD.MODundefined:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1634 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1635
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1636 case MOD.MODconst:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1637 if (isShared())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1638 t = sharedConstOf();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1639 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1640 t = constOf();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1641 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1642
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1643 case MOD.MODimmutable:
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1644 t = invariantOf();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1645 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1646
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1647 case MOD.MODshared:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1648 if (isConst())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1649 t = sharedConstOf();
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1650 else if (isWild())
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1651 t = sharedWildOf();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1652 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1653 t = sharedOf();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1654 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1655
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1656 case MOD.MODshared | MOD.MODconst:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1657 t = sharedConstOf();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1658 break;
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1659
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1660 case MOD.MODwild:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1661 if (isConst())
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1662 {}
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1663 else if (isShared())
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1664 t = sharedWildOf();
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1665 else
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1666 t = wildOf();
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1667 break;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1668
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1669 case MOD.MODshared | MOD.MODwild:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1670 t = sharedWildOf();
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1671 break;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1672 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1673 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1674 return t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1675 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1676
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
1677 Type addStorageClass(StorageClass stc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1678 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1679 /* Just translate to MOD bits and let addMod() do the work
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1680 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1681 MOD mod = MOD.MODundefined;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1682
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1683 if (stc & STC.STCimmutable)
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1684 mod = MOD.MODimmutable;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1685 else
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1686 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1687 if (stc & (STC.STCconst | STC.STCin))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1688 mod = MOD.MODconst;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1689 if (stc & STC.STCshared)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1690 mod |= MOD.MODshared;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1691 if (stc & STC.STCwild)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1692 mod |= MOD.MODwild;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1693 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1694
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1695 return addMod(mod);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1696 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1697
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1698 Type pointerTo()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1699 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1700 if (pto is null)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1701 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1702 Type t = new TypePointer(this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1703 pto = t.merge();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1704 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1705
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1706 return pto;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1707 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1708
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1709 Type referenceTo()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1710 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1711 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1712 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1713
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1714 final Type clone()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1715 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
1716 return cloneThis(this);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1717 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1718
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1719 Type arrayOf()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1720 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1721 if (!arrayof)
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1722 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1723 Type t = new TypeDArray(this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1724 arrayof = t.merge();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1725 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1726 return arrayof;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1727 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1728
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1729 Type makeConst()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1730 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1731 //printf("Type.makeConst() %p, %s\n", this, toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1732 if (cto)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1733 return cto;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1734
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1735 Type t = clone();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1736 t.mod = MOD.MODconst;
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1737
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1738 t.deco = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1739 t.arrayof = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1740 t.pto = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1741 t.rto = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1742 t.cto = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1743 t.ito = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1744 t.sto = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1745 t.scto = null;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1746 t.wto = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1747 t.swto = null;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1748 t.vtinfo = null;
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1749
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1750 //printf("-Type.makeConst() %p, %s\n", t, toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1751 return t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1752 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1753
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1754 Type makeInvariant()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1755 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1756 if (ito) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1757 return ito;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1758 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1759
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1760 Type t = clone();
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1761 t.mod = MOD.MODimmutable;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1762
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1763 t.deco = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1764 t.arrayof = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1765 t.pto = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1766 t.rto = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1767 t.cto = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1768 t.ito = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1769 t.sto = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1770 t.scto = null;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1771 t.wto = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1772 t.swto = null;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1773 t.vtinfo = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1774
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1775 return t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1776 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1777
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1778 Type makeShared()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1779 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1780 if (sto)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1781 return sto;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1782
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1783 Type t = clone();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1784 t.mod = MOD.MODshared;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1785
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1786 t.deco = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1787 t.arrayof = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1788 t.pto = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1789 t.rto = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1790 t.cto = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1791 t.ito = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1792 t.sto = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1793 t.scto = null;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1794 t.wto = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1795 t.swto = null;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1796 t.vtinfo = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1797
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1798 return t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1799 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1800
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1801 Type makeSharedConst()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1802 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1803 if (scto)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1804 return scto;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1805
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1806 Type t = clone();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1807 t.mod = MODshared | MODconst;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1808
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1809 t.deco = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1810 t.arrayof = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1811 t.pto = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1812 t.rto = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1813 t.cto = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1814 t.ito = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1815 t.sto = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1816 t.scto = null;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1817 t.wto = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1818 t.swto = null;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1819 t.vtinfo = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1820
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1821 return t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1822 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1823
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1824 Type makeWild()
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1825 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1826 if (wto)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1827 return wto;
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1828
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1829 Type t = clone();
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1830 t.mod = MOD.MODwild;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1831 t.deco = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1832 t.arrayof = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1833 t.pto = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1834 t.rto = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1835 t.cto = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1836 t.ito = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1837 t.sto = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1838 t.scto = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1839 t.wto = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1840 t.swto = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1841 t.vtinfo = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1842 return t;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1843 }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1844
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1845 Type makeSharedWild()
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1846 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1847 if (swto)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1848 return swto;
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1849
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1850 Type t = clone();
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1851 t.mod = MOD.MODshared | MOD.MODwild;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1852 t.deco = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1853 t.arrayof = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1854 t.pto = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1855 t.rto = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1856 t.cto = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1857 t.ito = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1858 t.sto = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1859 t.scto = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1860 t.wto = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1861 t.swto = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1862 t.vtinfo = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1863 return t;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1864 }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1865
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1866 Type makeMutable()
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1867 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1868 Type t = clone();
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1869 t.mod = mod & MOD.MODshared;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1870 t.deco = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1871 t.arrayof = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1872 t.pto = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1873 t.rto = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1874 t.cto = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1875 t.ito = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1876 t.sto = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1877 t.scto = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1878 t.wto = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1879 t.swto = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1880 t.vtinfo = null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1881 return t;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1882 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1883
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1884 Dsymbol toDsymbol(Scope sc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1885 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1886 return null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1887 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1888
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1889 /*******************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1890 * If this is a shell around another type,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1891 * get that other type.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1892 */
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1893
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1894 Type toBasetype()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1895 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1896 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1897 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1898
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1899 /**************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1900 * Return type with the top level of it being mutable.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1901 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1902 Type toHeadMutable()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1903 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1904 if (!mod)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1905 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1906
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1907 return mutableOf();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1908 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1909
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1910 bool isBaseOf(Type t, int* poffset)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1911 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1912 return false; // assume not
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1913 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1914
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1915 /*******************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1916 * Determine if converting 'this' to 'to' is an identity operation,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1917 * a conversion to const operation, or the types aren't the same.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1918 * Returns:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1919 * MATCHequal 'this' == 'to'
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1920 * MATCHconst 'to' is const
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1921 * MATCHnomatch conversion to mutable or invariant
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1922 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1923 MATCH constConv(Type to)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1924 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1925 if (equals(to))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1926 return MATCH.MATCHexact;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1927 if (ty == to.ty && MODimplicitConv(mod, to.mod))
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1928 return MATCH.MATCHconst;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1929 return MATCH.MATCHnomatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1930 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1931
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1932 /********************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1933 * Determine if 'this' can be implicitly converted
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1934 * to type 'to'.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1935 * Returns:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1936 * MATCHnomatch, MATCHconvert, MATCHconst, MATCHexact
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1937 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1938 MATCH implicitConvTo(Type to)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1939 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1940 //printf("Type.implicitConvTo(this=%p, to=%p)\n", this, to);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1941 //printf("from: %s\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1942 //printf("to : %s\n", to.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1943 if (this is to)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1944 return MATCHexact;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1945
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1946 return MATCHnomatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1947 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1948
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1949 ClassDeclaration isClassHandle()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1950 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1951 return null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1952 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1953
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1954 Expression getProperty(Loc loc, Identifier ident)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1955 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1956 Expression e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1957
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1958 version (LOGDOTEXP) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1959 printf("Type.getProperty(type = '%s', ident = '%s')\n", toChars(), ident.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1960 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1961 if (ident == Id.__sizeof)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1962 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1963 e = new IntegerExp(loc, size(loc), Type.tsize_t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1964 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1965 else if (ident == Id.size)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1966 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1967 error(loc, ".size property should be replaced with .sizeof");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1968 e = new ErrorExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1969 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1970 else if (ident is Id.alignof_)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1971 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1972 e = new IntegerExp(loc, alignsize(), Type.tsize_t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1973 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1974 else if (ident == Id.typeinfo_)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1975 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1976 if (!global.params.useDeprecated)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1977 error(loc, ".typeinfo deprecated, use typeid(type)");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1978 e = getTypeInfo(null);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1979 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1980 else if (ident == Id.init_)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1981 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1982 if (ty == TY.Tvoid)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1983 error(loc, "void does not have an initializer");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1984 e = defaultInit(loc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1985 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1986 else if (ident is Id.mangleof_)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1987 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1988 string s;
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1989 if (!deco) {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1990 s = toChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1991 error(loc, "forward reference of type %s.mangleof", s);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1992 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1993 s = deco;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1994 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1995
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1996 e = new StringExp(loc, s, 'c');
87
b17640f0e4e8 Fixed a bug with a Scope.this(Scope enclosing) being called instead of Scope.clone() method (as a copy ctor replacement)
korDen
parents: 79
diff changeset
1997 scope Scope sc = new Scope();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1998 e = e.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1999 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2000 else if (ident is Id.stringof_)
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2001 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2002 string s = toChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2003 e = new StringExp(loc, s, 'c');
87
b17640f0e4e8 Fixed a bug with a Scope.this(Scope enclosing) being called instead of Scope.clone() method (as a copy ctor replacement)
korDen
parents: 79
diff changeset
2004 scope Scope sc = new Scope();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2005 e = e.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2006 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2007 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2008 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2009 error(loc, "no property '%s' for type '%s'", ident.toChars(), toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2010 e = new ErrorExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2011 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2012 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2013 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2014
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2015 Expression dotExp(Scope sc, Expression e, Identifier ident)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2016 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2017 VarDeclaration v = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2018
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2019 version (LOGDOTEXP) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2020 printf("Type.dotExp(e = '%s', ident = '%s')\n", e.toChars(), ident.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2021 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2022 if (e.op == TOK.TOKdotvar)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2023 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2024 DotVarExp dv = cast(DotVarExp)e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2025 v = dv.var.isVarDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2026 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2027 else if (e.op == TOK.TOKvar)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2028 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2029 VarExp ve = cast(VarExp)e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2030 v = ve.var.isVarDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2031 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2032 if (v)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2033 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2034 if (ident is Id.offset)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2035 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2036 if (!global.params.useDeprecated)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2037 error(e.loc, ".offset deprecated, use .offsetof");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2038 goto Loffset;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2039 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2040 else if (ident is Id.offsetof)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2041 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2042 Loffset:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2043 if (v.storage_class & STC.STCfield)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2044 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2045 e = new IntegerExp(e.loc, v.offset, Type.tsize_t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2046 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2047 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2048 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2049 else if (ident is Id.init_)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2050 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2051 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2052 if (v.init)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2053 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2054 if (v.init.isVoidInitializer())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2055 error(e.loc, "%s.init is void", v.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2056 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2057 { Loc loc = e.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2058 e = v.init.toExpression();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2059 if (e.op == TOK.TOKassign || e.op == TOK.TOKconstruct || e.op == TOK.TOKblit)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2060 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2061 e = (cast(AssignExp)e).e2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2062
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2063 /* Take care of case where we used a 0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2064 * to initialize the struct.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2065 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2066 if (e.type == Type.tint32 &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2067 e.isBool(0) &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2068 v.type.toBasetype().ty == TY.Tstruct)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2069 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2070 e = v.type.defaultInit(e.loc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2071 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2072 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2073 e = e.optimize(WANTvalue | WANTinterpret);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2074 // if (!e.isConst())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2075 // error(loc, ".init cannot be evaluated at compile time");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2076 }
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2077 goto Lreturn;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2078 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2079 }
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2080 e = defaultInit(e.loc);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2081 goto Lreturn;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2082 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2083 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2084 if (ident is Id.typeinfo_)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2085 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2086 if (!global.params.useDeprecated)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2087 error(e.loc, ".typeinfo deprecated, use typeid(type)");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2088 e = getTypeInfo(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2089 }
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2090 else if (ident is Id.stringof_)
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2091 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2092 string s = e.toChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2093 e = new StringExp(e.loc, s, 'c');
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2094 }
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2095 else
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2096 e = getProperty(e.loc, ident);
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2097
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2098 Lreturn:
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2099 e = e.semantic(sc);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2100 return e;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2101 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2102
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2103 /***************************************
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2104 * Figures out what to do with an undefined member reference
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2105 * for classes and structs.
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2106 */
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2107 Expression noMember(Scope sc, Expression e, Identifier ident)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2108 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2109 assert(ty == TY.Tstruct || ty == TY.Tclass);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2110 AggregateDeclaration sym = toDsymbol(sc).isAggregateDeclaration();
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2111 assert(sym);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2112
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
2113 if (ident !is Id.__sizeof &&
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
2114 ident !is Id.alignof_ &&
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
2115 ident !is Id.init_ &&
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
2116 ident !is Id.mangleof_ &&
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
2117 ident !is Id.stringof_ &&
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
2118 ident !is Id.offsetof)
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2119 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2120 /* See if we should forward to the alias this.
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2121 */
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2122 if (sym.aliasthis)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2123 { /* Rewrite e.ident as:
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2124 * e.aliasthis.ident
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2125 */
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2126 e = new DotIdExp(e.loc, e, sym.aliasthis.ident);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2127 e = new DotIdExp(e.loc, e, ident);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2128 return e.semantic(sc);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2129 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2131 /* Look for overloaded opDot() to see if we should forward request
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2132 * to it.
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2133 */
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2134 Dsymbol fd = search_function(sym, Id.opDot);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2135 if (fd)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2136 { /* Rewrite e.ident as:
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2137 * e.opDot().ident
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2138 */
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
2139 e = build_overload(e.loc, sc, e, null, fd.ident);
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2140 e = new DotIdExp(e.loc, e, ident);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2141 return e.semantic(sc);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2142 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2143
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2144 /* Look for overloaded opDispatch to see if we should forward request
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2145 * to it.
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2146 */
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2147 fd = search_function(sym, Id.opDispatch);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2148 if (fd)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2149 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2150 /* Rewrite e.ident as:
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2151 * e.opDispatch!("ident")
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2152 */
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2153 TemplateDeclaration td = fd.isTemplateDeclaration();
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2154 if (!td)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2155 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2156 fd.error("must be a template opDispatch(string s), not a %s", fd.kind());
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2157 return new ErrorExp();
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2158 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2159 auto se = new StringExp(e.loc, ident.toChars());
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2160 auto tiargs = new Objects();
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2161 tiargs.push(se);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2162 e = new DotTemplateInstanceExp(e.loc, e, Id.opDispatch, tiargs);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2163 (cast(DotTemplateInstanceExp)e).ti.tempdecl = td;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2164 return e;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2165 //return e.semantic(sc);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2166 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2167 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2168
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2169 return Type.dotExp(sc, e, ident);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
2170 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2171
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2172 uint memalign(uint salign)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2173 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2174 return salign;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2175 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2176
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2177 Expression defaultInit(Loc loc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2178 {
170
96c0fff6897d more global state cleanup
korDen
parents: 157
diff changeset
2179 version (LOGDEFAULTINIT) {
96c0fff6897d more global state cleanup
korDen
parents: 157
diff changeset
2180 printf("Type.defaultInit() '%.*s'\n", toChars());
96c0fff6897d more global state cleanup
korDen
parents: 157
diff changeset
2181 }
96c0fff6897d more global state cleanup
korDen
parents: 157
diff changeset
2182 return null;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2183 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2184
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2185 /***************************************
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2186 * Use when we prefer the default initializer to be a literal,
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2187 * rather than a global immutable variable.
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2188 */
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2189 //Expression defaultInitLiteral(Loc loc = Loc(0))
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2190 Expression defaultInitLiteral(Loc loc)
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2191 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2192 version(LOGDEFAULTINIT) {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2193 printf("Type::defaultInitLiteral() '%s'\n", toChars());
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2194 }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2195 return defaultInit(loc);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2196 }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2197
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2198 ///bool isZeroInit(Loc loc = Loc(0)) // if initializer is 0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2199 bool isZeroInit(Loc loc) // if initializer is 0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2200 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2201 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2202 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2203
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2204 dt_t** toDt(dt_t** pdt)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2205 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2206 //printf("Type.toDt()\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2207 Expression e = defaultInit(Loc(0));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2208 return e.toDt(pdt);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2209 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2210
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2211 Identifier getTypeInfoIdent(int internal)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2212 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2213 // _init_10TypeInfo_%s
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2214 scope OutBuffer buf = new OutBuffer();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2215 Identifier id;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2216 char* name;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2217 int len;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2218
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2219 if (internal)
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2220 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2221 buf.writeByte(mangleChar[ty]);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2222 if (ty == TY.Tarray)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2223 buf.writeByte(mangleChar[(cast(TypeArray)this).next.ty]);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2224 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2225 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2226 toDecoBuffer(buf);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2227
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2228 len = buf.offset;
14
2cc604139636 Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents: 4
diff changeset
2229 version (Bug4054)
2cc604139636 Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents: 4
diff changeset
2230 name = cast(char*)GC.malloc(19 + len.sizeof * 3 + len + 1);
2cc604139636 Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents: 4
diff changeset
2231 else
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2232 name = cast(char*)alloca(19 + len.sizeof * 3 + len + 1);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2233 buf.writeByte(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2234 version (TARGET_OSX) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2235 // The LINKc will prepend the _
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2236 len = sprintf(name, "D%dTypeInfo_%s6__initZ".ptr, 9 + len, buf.data);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2237 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2238 len = sprintf(name, "_D%dTypeInfo_%s6__initZ".ptr, 9 + len, buf.data);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2239 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2240 if (global.params.isWindows)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2241 name++; // C mangling will add it back in
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2242 //printf("name = %s\n", name);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2243 id = Lexer.idPool(name[0..len-1].idup);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2244 return id;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2245 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2246
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2247 /* These form the heart of template argument deduction.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2248 * Given 'this' being the type argument to the template instance,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2249 * it is matched against the template declaration parameter specialization
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2250 * 'tparam' to determine the type to be used for the parameter.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2251 * Example:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2252 * template Foo(T:T*) // template declaration
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2253 * Foo!(int*) // template instantiation
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2254 * Input:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2255 * this = int*
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2256 * tparam = T
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2257 * parameters = [ T:T* ] // Array of TemplateParameter's
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2258 * Output:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2259 * dedtypes = [ int ] // Array of Expression/Type's
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2260 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2261 MATCH deduceType(Scope sc, Type tparam, TemplateParameters parameters, Objects dedtypes)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2262 {
98
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2263 static if (false)
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2264 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2265 printf("Type.deduceType()\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2266 printf("\tthis = %d, ", ty); print();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2267 printf("\ttparam = %d, ", tparam.ty); tparam.print();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2268 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2269 if (!tparam)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2270 goto Lnomatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2271
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2272 if (this == tparam)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2273 goto Lexact;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2274
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2275 if (tparam.ty == Tident)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2276 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2277 // Determine which parameter tparam is
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2278 int i = templateParameterLookup(tparam, parameters);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2279 if (i == -1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2280 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2281 if (!sc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2282 goto Lnomatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2283
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2284 /* Need a loc to go with the semantic routine.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2285 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2286 Loc loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2287 if (parameters.dim)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2288 {
121
347de076ad34 TemplateParameters -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
2289 auto tp = parameters[0];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2290 loc = tp.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2291 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2292
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2293 /* BUG: what if tparam is a template instance, that
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2294 * has as an argument another Tident?
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2295 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2296 tparam = tparam.semantic(loc, sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2297 assert(tparam.ty != Tident);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2298 return deduceType(sc, tparam, parameters, dedtypes);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2299 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2300
121
347de076ad34 TemplateParameters -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
2301 auto tp = parameters[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2302
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2303 // Found the corresponding parameter tp
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2304 if (!tp.isTemplateTypeParameter())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2305 goto Lnomatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2306 Type tt = this;
113
3482c73a991b More cleanup for arrays
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 110
diff changeset
2307 Type at = cast(Type)dedtypes[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2308
98
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2309 // 5*5 == 25 cases
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2310 static pure int X(int U, int T) { return ((U << 4) | T); }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2311
98
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2312 switch (X(tparam.mod, mod))
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2313 {
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2314 case X(0, 0):
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2315 case X(0, MODconst):
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2316 case X(0, MODimmutable):
98
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2317 case X(0, MODshared):
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2318 case X(0, MODconst | MODshared):
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2319 case X(0, MODwild):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2320 case X(0, MODwild | MODshared):
98
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2321 // foo(U:U) T => T
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2322 // foo(U:U) const(T) => const(T)
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2323 // foo(U:U) immutable(T) => immutable(T)
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2324 // foo(U:U) shared(T) => shared(T)
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2325 // foo(U:U) const(shared(T)) => const(shared(T))
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2326 // foo(U:U) wild(T) => wild(T)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2327 // foo(U:U) wild(shared(T)) => wild(shared(T))
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2328 if (!at)
110
12c0c84d13fd merged in 2.036 changes
Trass3r
parents: 98 94
diff changeset
2329 { dedtypes[i] = tt;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2330 goto Lexact;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2331 }
98
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2332 break;
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2333
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2334 case X(MODconst, MODconst):
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2335 case X(MODimmutable, MODimmutable):
98
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2336 case X(MODshared, MODshared):
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2337 case X(MODconst | MODshared, MODconst | MODshared):
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2338 case X(MODwild, MODwild):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2339 case X(MODwild | MODshared, MODwild | MODshared):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2340 case X(MODconst, MODwild):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2341 case X(MODconst, MODwild | MODshared):
98
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2342 // foo(U:const(U)) const(T) => T
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2343 // foo(U:immutable(U)) immutable(T) => T
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2344 // foo(U:shared(U)) shared(T) => T
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2345 // foo(U:const(shared(U)) const(shared(T))=> T
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2346 // foo(U:wild(U)) wild(T) => T
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2347 // foo(U:wild(shared(U)) wild(shared(T)) => T
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2348 // foo(U:const(U)) wild(shared(T)) => shared(T)
98
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2349 tt = mutableOf().unSharedOf();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2350 if (!at)
110
12c0c84d13fd merged in 2.036 changes
Trass3r
parents: 98 94
diff changeset
2351 {
94
3a0b150c9841 Objects -> Vector!Object iteration 1
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 87
diff changeset
2352 dedtypes[i] = tt;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2353 goto Lexact;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2354 }
98
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2355 break;
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2356
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2357 case X(MODconst, 0):
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2358 case X(MODconst, MODimmutable):
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2359 case X(MODconst, MODconst | MODshared):
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2360 case X(MODconst | MODshared, MODimmutable):
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2361 case X(MODshared, MODwild | MODshared):
98
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2362 // foo(U:const(U)) T => T
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2363 // foo(U:const(U)) immutable(T) => T
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2364 // foo(U:const(U)) const(shared(T)) => shared(T)
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2365 // foo(U:const(shared(U)) immutable(T) => T
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2366 // foo(U:shared(U)) wild(shared(T)) => wild(T)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2367 tt = mutableOf();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2368 if (!at)
110
12c0c84d13fd merged in 2.036 changes
Trass3r
parents: 98 94
diff changeset
2369 { dedtypes[i] = tt;
98
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2370 goto Lconst;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2371 }
98
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2372 break;
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2373
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2374 case X(MODshared, MODconst | MODshared):
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2375 case X(MODconst | MODshared, MODshared):
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2376 // foo(U:shared(U)) const(shared(T)) => const(T)
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2377 // foo(U:const(shared(U)) shared(T) => T
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2378 tt = unSharedOf();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2379 if (!at)
110
12c0c84d13fd merged in 2.036 changes
Trass3r
parents: 98 94
diff changeset
2380 { dedtypes[i] = tt;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2381 goto Lconst;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2382 }
98
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2383 break;
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2384
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2385 case X(MODimmutable, 0):
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2386 case X(MODimmutable, MODconst):
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2387 case X(MODimmutable, MODshared):
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2388 case X(MODimmutable, MODconst | MODshared):
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2389 case X(MODconst, MODshared):
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2390 case X(MODshared, 0):
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2391 case X(MODshared, MODconst):
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2392 case X(MODshared, MODimmutable):
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2393 case X(MODconst | MODshared, 0):
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2394 case X(MODconst | MODshared, MODconst):
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2395 case X(MODimmutable, MODwild):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2396 case X(MODshared, MODwild):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2397 case X(MODconst | MODshared, MODwild):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2398 case X(MODwild, 0):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2399 case X(MODwild, MODconst):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2400 case X(MODwild, MODimmutable):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2401 case X(MODwild, MODshared):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2402 case X(MODwild, MODconst | MODshared):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2403 case X(MODwild | MODshared, 0):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2404 case X(MODwild | MODshared, MODconst):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2405 case X(MODwild | MODshared, MODimmutable):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2406 case X(MODwild | MODshared, MODshared):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2407 case X(MODwild | MODshared, MODconst | MODshared):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2408 case X(MODwild | MODshared, MODwild):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2409 case X(MODimmutable, MODwild | MODshared):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2410 case X(MODconst | MODshared, MODwild | MODshared):
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2411 case X(MODwild, MODwild | MODshared):
98
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2412 // foo(U:immutable(U)) T => nomatch
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2413 // foo(U:immutable(U)) const(T) => nomatch
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2414 // foo(U:immutable(U)) shared(T) => nomatch
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2415 // foo(U:immutable(U)) const(shared(T)) => nomatch
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2416 // foo(U:const(U)) shared(T) => nomatch
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2417 // foo(U:shared(U)) T => nomatch
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2418 // foo(U:shared(U)) const(T) => nomatch
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2419 // foo(U:shared(U)) immutable(T) => nomatch
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2420 // foo(U:const(shared(U)) T => nomatch
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2421 // foo(U:const(shared(U)) const(T) => nomatch
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2422 // foo(U:immutable(U)) wild(T) => nomatch
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2423 // foo(U:shared(U)) wild(T) => nomatch
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2424 // foo(U:const(shared(U)) wild(T) => nomatch
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2425 // foo(U:wild(U)) T => nomatch
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2426 // foo(U:wild(U)) const(T) => nomatch
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2427 // foo(U:wild(U)) immutable(T) => nomatch
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2428 // foo(U:wild(U)) shared(T) => nomatch
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2429 // foo(U:wild(U)) const(shared(T)) => nomatch
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2430 // foo(U:wild(shared(U)) T => nomatch
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2431 // foo(U:wild(shared(U)) const(T) => nomatch
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2432 // foo(U:wild(shared(U)) immutable(T) => nomatch
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2433 // foo(U:wild(shared(U)) shared(T) => nomatch
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2434 // foo(U:wild(shared(U)) const(shared(T)) => nomatch
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2435 // foo(U:wild(shared(U)) wild(T) => nomatch
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2436 // foo(U:immutable(U)) wild(shared(T)) => nomatch
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2437 // foo(U:const(shared(U))) wild(shared(T)) => nomatch
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2438 // foo(U:wild(U)) wild(shared(T)) => nomatch
98
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2439 //if (!at)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2440 goto Lnomatch;
98
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2441 break;
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2442
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2443 default:
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2444 assert(0);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2445 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2446
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2447 if (tt.equals(at))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2448 goto Lexact;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2449 else if (tt.ty == Tclass && at.ty == Tclass)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2450 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2451 return tt.implicitConvTo(at);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2452 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2453 else if (tt.ty == Tsarray && at.ty == Tarray &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2454 tt.nextOf().implicitConvTo(at.nextOf()) >= MATCHconst)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2455 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2456 goto Lexact;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2457 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2458 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2459 goto Lnomatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2460 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2461
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2462 if (ty != tparam.ty)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2463 return implicitConvTo(tparam);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2464 // goto Lnomatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2465
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2466 if (nextOf())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2467 return nextOf().deduceType(sc, tparam.nextOf(), parameters, dedtypes);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2468
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2469 Lexact:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2470 return MATCHexact;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2471
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2472 Lnomatch:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2473 return MATCHnomatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2474
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2475 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2476 Lconst:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2477 return MATCHconst;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2478 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2479 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2480
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2481 void resolve(Loc loc, Scope sc, Expression* pe, Type* pt, Dsymbol* ps)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2482 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2483 //printf("Type.resolve() %s, %d\n", toChars(), ty);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2484 Type t = semantic(loc, sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2485 *pt = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2486 *pe = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2487 *ps = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2488 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2489
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2490 /*******************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2491 * Get a canonicalized form of the TypeInfo for use with the internal
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2492 * runtime library routines. Canonicalized in that static arrays are
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2493 * represented as dynamic arrays, enums are represented by their
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2494 * underlying type, etc. This reduces the number of TypeInfo's needed,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2495 * so we can use the custom internal ones more.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2496 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2497 Expression getInternalTypeInfo(Scope sc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2498 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2499 TypeInfoDeclaration tid;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2500 Expression e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2501 Type t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2502
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2503 //printf("Type.getInternalTypeInfo() %s\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2504 t = toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2505 switch (t.ty)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2506 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2507 case Tsarray:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2508 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2509 // convert to corresponding dynamic array type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2510 t = t.nextOf().mutableOf().arrayOf();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2511 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2512 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2513
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2514 case Tclass:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2515 if ((cast(TypeClass)t).sym.isInterfaceDeclaration())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2516 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2517 goto Linternal;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2518
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2519 case Tarray:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2520 // convert to corresponding dynamic array type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2521 t = t.nextOf().mutableOf().arrayOf();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2522 if (t.nextOf().ty != Tclass)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2523 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2524 goto Linternal;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2525
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2526 case Tfunction:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2527 case Tdelegate:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2528 case Tpointer:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2529 Linternal:
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
2530 tid = global.internalTI[t.ty];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2531 if (!tid)
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2532 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2533 tid = new TypeInfoDeclaration(t, 1);
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
2534 global.internalTI[t.ty] = tid;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2535 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2536 e = new VarExp(Loc(0), tid);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2537 e = e.addressOf(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2538 e.type = tid.type; // do this so we don't get redundant dereference
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2539 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2540
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2541 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2542 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2543 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2544 //printf("\tcalling getTypeInfo() %s\n", t.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2545 return t.getTypeInfo(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2546 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2547
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2548 /****************************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2549 * Get the exact TypeInfo.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2550 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2551 Expression getTypeInfo(Scope sc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2552 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2553 Expression e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2554 Type t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2555
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2556 //printf("Type.getTypeInfo() %p, %s\n", this, toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2557 t = merge2(); // do this since not all Type's are merge'd
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2558 if (!t.vtinfo)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2559 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2560 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2561 if (t.isShared()) // does both 'shared' and 'shared const'
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2562 t.vtinfo = new TypeInfoSharedDeclaration(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2563 else if (t.isConst())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2564 t.vtinfo = new TypeInfoConstDeclaration(t);
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2565 else if (t.isImmutable())
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2566 t.vtinfo = new TypeInfoInvariantDeclaration(t);
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2567 else if (t.isWild())
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2568 t.vtinfo = new TypeInfoWildDeclaration(t);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2569
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2570 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2571 t.vtinfo = t.getTypeInfoDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2572 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2573 t.vtinfo = t.getTypeInfoDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2574 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2575 assert(t.vtinfo);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2576 vtinfo = t.vtinfo;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2577
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2578 /* If this has a custom implementation in std/typeinfo, then
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2579 * do not generate a COMDAT for it.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2580 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2581 if (!t.builtinTypeInfo())
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2582 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2583 // Generate COMDAT
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2584 if (sc) // if in semantic() pass
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2585 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2586 // Find module that will go all the way to an object file
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2587 Module m = sc.module_.importedFrom;
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
2588 m.members.push(t.vtinfo);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2589 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2590 else // if in obj generation pass
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2591 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2592 t.vtinfo.toObjFile(global.params.multiobj);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2593 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2594 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2595 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2596 e = new VarExp(Loc(0), t.vtinfo);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2597 e = e.addressOf(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2598 e.type = t.vtinfo.type; // do this so we don't get redundant dereference
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2599 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2600 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2601
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2602 TypeInfoDeclaration getTypeInfoDeclaration()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2603 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2604 //printf("Type.getTypeInfoDeclaration() %s\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2605 return new TypeInfoDeclaration(this, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2606 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2607
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2608 /* These decide if there's an instance for them already in std.typeinfo,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2609 * because then the compiler doesn't need to build one.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2610 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2611 bool builtinTypeInfo()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2612 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2613 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2614 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2615
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2616 /*******************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2617 * If one of the subtypes of this type is a TypeIdentifier,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2618 * i.e. it's an unresolved type, return that type.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2619 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2620 Type reliesOnTident()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2621 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2622 return null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2623 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2624
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2625 /***************************************
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2626 * Return !=0 if the type or any of its subtypes is wild.
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2627 */
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2628
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2629 int hasWild()
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2630 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2631 return mod & MOD.MODwild;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2632 }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2633
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2634 /***************************************
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2635 * Return MOD bits matching argument type (targ) to wild parameter type (this).
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2636 */
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2637
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2638 uint wildMatch(Type targ)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2639 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2640 return 0;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2641 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2642
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2643 Expression toExpression()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2644 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2645 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2646 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2647
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2648 /***************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2649 * Return true if type has pointers that need to
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2650 * be scanned by the GC during a collection cycle.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2651 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2652 bool hasPointers()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2653 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2654 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2655 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2656
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2657 /*************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2658 * If this is a type of something, return that something.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2659 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2660 Type nextOf()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2661 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2662 return null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2663 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2664
53
a8b50ff7f201 ForeachStatement.syntaxCopy
korDen
parents: 51
diff changeset
2665 /****************************************
a8b50ff7f201 ForeachStatement.syntaxCopy
korDen
parents: 51
diff changeset
2666 * Return the mask that an integral type will
a8b50ff7f201 ForeachStatement.syntaxCopy
korDen
parents: 51
diff changeset
2667 * fit into.
a8b50ff7f201 ForeachStatement.syntaxCopy
korDen
parents: 51
diff changeset
2668 */
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2669 ulong sizemask()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2670 {
53
a8b50ff7f201 ForeachStatement.syntaxCopy
korDen
parents: 51
diff changeset
2671 ulong m;
a8b50ff7f201 ForeachStatement.syntaxCopy
korDen
parents: 51
diff changeset
2672
a8b50ff7f201 ForeachStatement.syntaxCopy
korDen
parents: 51
diff changeset
2673 switch (toBasetype().ty)
a8b50ff7f201 ForeachStatement.syntaxCopy
korDen
parents: 51
diff changeset
2674 {
a8b50ff7f201 ForeachStatement.syntaxCopy
korDen
parents: 51
diff changeset
2675 case Tbool: m = 1; break;
a8b50ff7f201 ForeachStatement.syntaxCopy
korDen
parents: 51
diff changeset
2676 case Tchar:
a8b50ff7f201 ForeachStatement.syntaxCopy
korDen
parents: 51
diff changeset
2677 case Tint8:
a8b50ff7f201 ForeachStatement.syntaxCopy
korDen
parents: 51
diff changeset
2678 case Tuns8: m = 0xFF; break;
a8b50ff7f201 ForeachStatement.syntaxCopy
korDen
parents: 51
diff changeset
2679 case Twchar:
a8b50ff7f201 ForeachStatement.syntaxCopy
korDen
parents: 51
diff changeset
2680 case Tint16:
a8b50ff7f201 ForeachStatement.syntaxCopy
korDen
parents: 51
diff changeset
2681 case Tuns16: m = 0xFFFFUL; break;
a8b50ff7f201 ForeachStatement.syntaxCopy
korDen
parents: 51
diff changeset
2682 case Tdchar:
a8b50ff7f201 ForeachStatement.syntaxCopy
korDen
parents: 51
diff changeset
2683 case Tint32:
a8b50ff7f201 ForeachStatement.syntaxCopy
korDen
parents: 51
diff changeset
2684 case Tuns32: m = 0xFFFFFFFFUL; break;
a8b50ff7f201 ForeachStatement.syntaxCopy
korDen
parents: 51
diff changeset
2685 case Tint64:
a8b50ff7f201 ForeachStatement.syntaxCopy
korDen
parents: 51
diff changeset
2686 case Tuns64: m = 0xFFFFFFFFFFFFFFFFUL; break;
a8b50ff7f201 ForeachStatement.syntaxCopy
korDen
parents: 51
diff changeset
2687 default:
a8b50ff7f201 ForeachStatement.syntaxCopy
korDen
parents: 51
diff changeset
2688 assert(0);
a8b50ff7f201 ForeachStatement.syntaxCopy
korDen
parents: 51
diff changeset
2689 }
a8b50ff7f201 ForeachStatement.syntaxCopy
korDen
parents: 51
diff changeset
2690 return m;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2691 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2692
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2693 static void error(T...)(Loc loc, string format, T t)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2694 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2695 .error(loc, format, t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2696 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2697
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2698 static void warning(T...)(Loc loc, string format, T t)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2699 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2700 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2701 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2702
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2703 // For backend
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2704 /*****************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2705 * Return back end type corresponding to D front end type.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2706 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2707 TYM totym()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2708 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2709 TYM t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2710
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2711 switch (ty)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2712 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2713 case TY.Tvoid: t = TYM.TYvoid; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2714 case TY.Tint8: t = TYM.TYschar; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2715 case TY.Tuns8: t = TYM.TYuchar; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2716 case TY.Tint16: t = TYM.TYshort; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2717 case TY.Tuns16: t = TYM.TYushort; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2718 case TY.Tint32: t = TYM.TYint; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2719 case TY.Tuns32: t = TYM.TYuint; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2720 case TY.Tint64: t = TYM.TYllong; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2721 case TY.Tuns64: t = TYM.TYullong; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2722 case TY.Tfloat32: t = TYM.TYfloat; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2723 case TY.Tfloat64: t = TYM.TYdouble; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2724 case TY.Tfloat80: t = TYM.TYldouble; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2725 case TY.Timaginary32: t = TYM.TYifloat; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2726 case TY.Timaginary64: t = TYM.TYidouble; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2727 case TY.Timaginary80: t = TYM.TYildouble; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2728 case TY.Tcomplex32: t = TYM.TYcfloat; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2729 case TY.Tcomplex64: t = TYM.TYcdouble; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2730 case TY.Tcomplex80: t = TYM.TYcldouble; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2731 //case Tbit: t = TYM.TYuchar; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2732 case TY.Tbool: t = TYM.TYbool; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2733 case TY.Tchar: t = TYM.TYchar; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2734 version (XXX) { ///TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_SOLARIS
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2735 case TY.Twchar: t = TYM.TYwchar_t; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2736 case TY.Tdchar: t = TYM.TYdchar; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2737 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2738 case TY.Twchar: t = TYM.TYwchar_t; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2739 case TY.Tdchar:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2740 t = (global.params.symdebug == 1) ? TYM.TYdchar : TYM.TYulong;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2741 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2742 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2743
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2744 case TY.Taarray: t = TYM.TYaarray; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2745 case TY.Tclass:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2746 case TY.Treference:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2747 case TY.Tpointer: t = TYM.TYnptr; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2748 case TY.Tdelegate: t = TYM.TYdelegate; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2749 case TY.Tarray: t = TYM.TYdarray; break;
98
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2750 version(SARRAYVALUE)
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2751 { case TY.Tsarray: t = TYstruct; break;}
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2752 else
5c859d5fbe27 and more
Trass3r
parents: 95
diff changeset
2753 { case TY.Tsarray: t = TYM.TYarray; break;}
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2754 case TY.Tstruct: t = TYM.TYstruct; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2755
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2756 case TY.Tenum:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2757 case TY.Ttypedef:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2758 t = toBasetype().totym();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2759 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2760
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2761 case TY.Tident:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2762 case TY.Ttypeof:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2763 debug {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2764 writef("ty = %d, '%s'\n", ty, toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2765 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2766 error (Loc(0), "forward reference of %s", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2767 t = TYM.TYint;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2768 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2769
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2770 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2771 debug {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2772 writef("ty = %d, '%s'\n", ty, toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2773 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2774 assert(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2775 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2776
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2777 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2778 // Add modifiers
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2779 switch (mod)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2780 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2781 case MOD.MODundefined:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2782 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2783 case MOD.MODconst:
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2784 case MOD.MODwild:
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2785 t |= mTY.mTYconst;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2786 break;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2787 case MOD.MODimmutable:
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2788 t |= mTY.mTYimmutable;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2789 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2790 case MOD.MODshared:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2791 t |= mTY.mTYshared;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2792 break;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
2793 case MOD.MODshared | MOD.MODwild:
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2794 case MOD.MODshared | MOD.MODconst:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2795 t |= mTY.mTYshared | mTY.mTYconst;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2796 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2797 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2798 assert(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2799 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2800 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2801
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2802 return t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2803 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2804
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2805 /***************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2806 * Convert from D type to C type.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2807 * This is done so C debug info can be generated.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2808 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2809 type* toCtype()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2810 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2811 if (!ctype)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2812 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2813 ctype = type_fake(totym());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2814 ctype.Tcount++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2815 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2816 return ctype;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2817 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2818
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2819 type* toCParamtype()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2820 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2821 return toCtype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2822 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2823
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2824 Symbol* toSymbol()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2825 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2826 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2827 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2828
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2829 // For eliminating dynamic_cast
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2830 TypeBasic isTypeBasic()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2831 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2832 return null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2833 }
178
e3afd1303184 Many small bugs fixed
korDen
parents: 177
diff changeset
2834
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
2835 @property
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
2836 static ref Type[TY.TMAX] basic()
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
2837 {
177
1475fd394c9e bug fixes
korDen
parents: 176
diff changeset
2838 return global.basic;
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
2839 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2840
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2841 static Type tvoid()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2842 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2843 return basic[TY.Tvoid];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2844 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2845
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2846 static Type tint8()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2847 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2848 return basic[TY.Tint8];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2849 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2850
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2851 static Type tuns8()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2852 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2853 return basic[TY.Tuns8];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2854 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2855
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2856 static Type tint16()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2857 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2858 return basic[TY.Tint16];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2859 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2860
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2861 static Type tuns16()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2862 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2863 return basic[TY.Tuns16];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2864 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2865
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2866 static Type tint32()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2867 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2868 return basic[TY.Tint32];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2869 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2870
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2871 static Type tuns32()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2872 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2873 return basic[TY.Tuns32];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2874 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2875
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2876 static Type tint64()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2877 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2878 return basic[TY.Tint64];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2879 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2880
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2881 static Type tuns64()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2882 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2883 return basic[TY.Tuns64];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2884 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2885
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2886 static Type tfloat32()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2887 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2888 return basic[TY.Tfloat32];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2889 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2890
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2891 static Type tfloat64()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2892 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2893 return basic[TY.Tfloat64];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2894 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2895
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2896 static Type tfloat80()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2897 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2898 return basic[TY.Tfloat80];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2899 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2900
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2901 static Type timaginary32()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2902 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2903 return basic[TY.Timaginary32];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2904 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2905
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2906 static Type timaginary64()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2907 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2908 return basic[TY.Timaginary64];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2909 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2910
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2911 static Type timaginary80()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2912 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2913 return basic[TY.Timaginary80];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2914 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2915
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2916 static Type tcomplex32()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2917 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2918 return basic[TY.Tcomplex32];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2919 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2920
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2921 static Type tcomplex64()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2922 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2923 return basic[TY.Tcomplex64];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2924 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2925
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2926 static Type tcomplex80()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2927 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2928 return basic[TY.Tcomplex80];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2929 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2930
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2931 static Type tbit()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2932 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2933 return basic[TY.Tbit];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2934 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2935
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2936 static Type tbool()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2937 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2938 return basic[TY.Tbool];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2939 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2940
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2941 static Type tchar()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2942 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2943 return basic[TY.Tchar];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2944 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2945
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2946 static Type twchar()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2947 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2948 return basic[TY.Twchar];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2949 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2950
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2951 static Type tdchar()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2952 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2953 return basic[TY.Tdchar];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2954 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2955
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2956 // Some special types
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2957 static Type tshiftcnt()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2958 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2959 return tint32; // right side of shift expression
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2960 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2961
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2962 // #define tboolean tint32 // result of boolean expression
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2963 static Type tboolean()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2964 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2965 return tbool; // result of boolean expression
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2966 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2967
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2968 static Type tindex()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2969 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2970 return tint32; // array/ptr index
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2971 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2972
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2973 static Type terror()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2974 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2975 return basic[TY.Terror]; // for error recovery
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2976 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2977
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2978 static Type tsize_t()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2979 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2980 return basic[Tsize_t]; // matches size_t alias
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2981 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2982
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2983 static Type tptrdiff_t()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2984 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2985 return basic[Tptrdiff_t]; // matches ptrdiff_t alias
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2986 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
2987
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2988 static Type thash_t()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2989 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2990 return tsize_t; // matches hash_t alias
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2991 }
14
2cc604139636 Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents: 4
diff changeset
2992 }