annotate dmd/Parameter.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 af1bebfd96a4
children b0d41ff5e0df
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
1 module dmd.Parameter;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 56
diff changeset
3 import dmd.common;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4 import dmd.Type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5 import dmd.Identifier;
56
51605de93870 TupleExp.optimize
korDen
parents: 16
diff changeset
6 import dmd.TypeArray;
51605de93870 TupleExp.optimize
korDen
parents: 16
diff changeset
7 import dmd.TypeFunction;
51605de93870 TupleExp.optimize
korDen
parents: 16
diff changeset
8 import dmd.TypeDelegate;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
9 import dmd.TypeTuple;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
10 import dmd.TY;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
11 import dmd.Expression;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
12 import dmd.OutBuffer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
13 import dmd.HdrGenState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
14 import dmd.ArrayTypes;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
15 import dmd.StorageClassDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
16 import dmd.Global;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
17 import dmd.MOD;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
18 import dmd.CppMangleState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
19 import dmd.STC;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
20
178
e3afd1303184 Many small bugs fixed
korDen
parents: 135
diff changeset
21 import dmd.TObject;
e3afd1303184 Many small bugs fixed
korDen
parents: 135
diff changeset
22
e3afd1303184 Many small bugs fixed
korDen
parents: 135
diff changeset
23 class Parameter : TObject
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
24 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
25 //enum InOut inout;
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
26 StorageClass storageClass;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
27 Type type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
28 Identifier ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
29 Expression defaultArg;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
30
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
31 this(StorageClass storageClass, Type type, Identifier ident, Expression defaultArg)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
32 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 135
diff changeset
33 register();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
34 this.type = type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
35 this.ident = ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
36 this.storageClass = storageClass;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
37 this.defaultArg = defaultArg;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
38 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
39
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
40 Parameter clone()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
41 {
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
42 return new Parameter(storageClass, type, ident, defaultArg);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
43 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
44
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
45 Parameter syntaxCopy()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
46 {
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
47 return new Parameter(storageClass, type ? type.syntaxCopy() : null, ident, defaultArg ? defaultArg.syntaxCopy() : null);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
48 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
49
56
51605de93870 TupleExp.optimize
korDen
parents: 16
diff changeset
50 /****************************************************
51605de93870 TupleExp.optimize
korDen
parents: 16
diff changeset
51 * Determine if parameter is a lazy array of delegates.
51605de93870 TupleExp.optimize
korDen
parents: 16
diff changeset
52 * If so, return the return type of those delegates.
51605de93870 TupleExp.optimize
korDen
parents: 16
diff changeset
53 * If not, return null.
51605de93870 TupleExp.optimize
korDen
parents: 16
diff changeset
54 */
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
55 Type isLazyArray()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
56 {
56
51605de93870 TupleExp.optimize
korDen
parents: 16
diff changeset
57 // if (inout == Lazy)
51605de93870 TupleExp.optimize
korDen
parents: 16
diff changeset
58 {
51605de93870 TupleExp.optimize
korDen
parents: 16
diff changeset
59 Type tb = type.toBasetype();
51605de93870 TupleExp.optimize
korDen
parents: 16
diff changeset
60 if (tb.ty == Tsarray || tb.ty == Tarray)
51605de93870 TupleExp.optimize
korDen
parents: 16
diff changeset
61 {
51605de93870 TupleExp.optimize
korDen
parents: 16
diff changeset
62 Type tel = (cast(TypeArray)tb).next.toBasetype();
51605de93870 TupleExp.optimize
korDen
parents: 16
diff changeset
63 if (tel.ty == Tdelegate)
51605de93870 TupleExp.optimize
korDen
parents: 16
diff changeset
64 {
51605de93870 TupleExp.optimize
korDen
parents: 16
diff changeset
65 TypeDelegate td = cast(TypeDelegate)tel;
51605de93870 TupleExp.optimize
korDen
parents: 16
diff changeset
66 TypeFunction tf = cast(TypeFunction)td.next;
51605de93870 TupleExp.optimize
korDen
parents: 16
diff changeset
67
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
68 if (!tf.varargs && Parameter.dim(tf.parameters) == 0)
56
51605de93870 TupleExp.optimize
korDen
parents: 16
diff changeset
69 {
51605de93870 TupleExp.optimize
korDen
parents: 16
diff changeset
70 return tf.next; // return type of delegate
51605de93870 TupleExp.optimize
korDen
parents: 16
diff changeset
71 }
51605de93870 TupleExp.optimize
korDen
parents: 16
diff changeset
72 }
51605de93870 TupleExp.optimize
korDen
parents: 16
diff changeset
73 }
51605de93870 TupleExp.optimize
korDen
parents: 16
diff changeset
74 }
51605de93870 TupleExp.optimize
korDen
parents: 16
diff changeset
75 return null;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
76 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
77
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
78 void toDecoBuffer(OutBuffer buf)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
79 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
80 if (storageClass & STC.STCscope)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
81 buf.writeByte('M');
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
82 switch (storageClass & (STC.STCin | STC.STCout | STC.STCref | STC.STClazy))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
83 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
84 case STC.STCundefined:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
85 case STC.STCin:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
86 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
87 case STC.STCout:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
88 buf.writeByte('J');
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
89 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
90 case STC.STCref:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
91 buf.writeByte('K');
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
92 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
93 case STC.STClazy:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
94 buf.writeByte('L');
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
95 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
96 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
97 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
98 int mod = 0x100;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
99 if (type.toBasetype().ty == TY.Tclass)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
100 mod = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
101 type.toDecoBuffer(buf, mod);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
102 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
103 //type.toHeadMutable().toDecoBuffer(buf, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
104 type.toDecoBuffer(buf, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
105 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
106 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
107
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
108 static Parameters arraySyntaxCopy(Parameters args)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
109 {
126
1765f3ef917d ClassDeclarations, Arguments -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
110 typeof(return) a = null;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
111
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
112 if (args)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
113 {
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
114 a = new Parameters();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
115 a.setDim(args.dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
116
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
117 for (size_t i = 0; i < a.dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
118 {
126
1765f3ef917d ClassDeclarations, Arguments -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
119 auto arg = args[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
120
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
121 arg = arg.syntaxCopy();
126
1765f3ef917d ClassDeclarations, Arguments -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
122 a[i] = arg;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
123 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
124 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
125
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
126 return a;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
127 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
128
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
129 static string argsTypesToChars(Parameters args, int varargs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
130 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
131 scope OutBuffer buf = new OutBuffer();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
132
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
133 static if (true) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
134 HdrGenState hgs;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
135 argsToCBuffer(buf, &hgs, args, varargs);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
136 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
137 buf.writeByte('(');
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
138 if (args)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
139 {
16
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
140 OutBuffer argbuf = new OutBuffer();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
141 HdrGenState hgs;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
142
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
143 for (int i = 0; i < args.dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
144 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
145 if (i)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
146 buf.writeByte(',');
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
147 auto arg = cast(Parameter)args.data[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
148 argbuf.reset();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
149 arg.type.toCBuffer2(&argbuf, &hgs, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
150 buf.write(&argbuf);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
151 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
152 if (varargs)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
153 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
154 if (i && varargs == 1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
155 buf.writeByte(',');
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
156 buf.writestring("...");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
157 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
158 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
159 buf.writeByte(')');
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
160 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
161 return buf.toChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
162 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
163
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
164 static void argsCppMangle(OutBuffer buf, CppMangleState* cms, Parameters arguments, int varargs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
165 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
166 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
167 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
168
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
169 static void argsToCBuffer(OutBuffer buf, HdrGenState* hgs, Parameters arguments, int varargs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
170 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
171 buf.writeByte('(');
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
172 if (arguments)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
173 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
174 int i;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
175 scope OutBuffer argbuf = new OutBuffer();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
176
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
177 for (i = 0; i < arguments.dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
178 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
179 if (i)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
180 buf.writestring(", ");
126
1765f3ef917d ClassDeclarations, Arguments -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
181 auto arg = arguments[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
182
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
183 if (arg.storageClass & STCauto)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
184 buf.writestring("auto ");
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
185
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
186 if (arg.storageClass & STCout)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
187 buf.writestring("out ");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
188 else if (arg.storageClass & STCref)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
189 buf.writestring((global.params.Dversion == 1) ? "inout " : "ref ");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
190 else if (arg.storageClass & STCin)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
191 buf.writestring("in ");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
192 else if (arg.storageClass & STClazy)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
193 buf.writestring("lazy ");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
194 else if (arg.storageClass & STCalias)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
195 buf.writestring("alias ");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
196
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
197 StorageClass stc = arg.storageClass;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
198 if (arg.type && arg.type.mod & MODshared)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
199 stc &= ~STCshared;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
200
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
201 StorageClassDeclaration.stcToCBuffer(buf, stc & (STCconst | STCimmutable | STCshared | STCscope));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
202
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
203 argbuf.reset();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
204 if (arg.storageClass & STCalias)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
205 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
206 if (arg.ident)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
207 argbuf.writestring(arg.ident.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
208 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
209 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
210 arg.type.toCBuffer(argbuf, arg.ident, hgs);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
211 if (arg.defaultArg)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
212 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
213 argbuf.writestring(" = ");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
214 arg.defaultArg.toCBuffer(argbuf, hgs);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
215 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
216 buf.write(argbuf);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
217 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
218 if (varargs)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
219 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
220 if (i && varargs == 1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
221 buf.writeByte(',');
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
222 buf.writestring("...");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
223 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
224 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
225 buf.writeByte(')');
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
226 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
227
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
228 static void argsToDecoBuffer(OutBuffer buf, Parameters arguments)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
229 {
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
230 //printf("Parameter::argsToDecoBuffer()\n");
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
231
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
232 // Write argument types
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
233 if (arguments)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
234 {
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
235 size_t dim = Parameter.dim(arguments);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
236 for (size_t i = 0; i < dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
237 {
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
238 auto arg = Parameter.getNth(arguments, i);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
239 arg.toDecoBuffer(buf);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
240 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
241 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
242 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
243
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
244 static int isTPL(Parameters arguments)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
245 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
246 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
247 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
248
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
249 /***************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
250 * Determine number of arguments, folding in tuples.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
251 */
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
252 static size_t dim(Parameters args)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
253 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
254 size_t n = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
255 if (args)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
256 {
126
1765f3ef917d ClassDeclarations, Arguments -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
257 foreach (arg; args)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
258 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
259 Type t = arg.type.toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
260
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
261 if (t.ty == TY.Ttuple)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
262 {
126
1765f3ef917d ClassDeclarations, Arguments -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
263 auto tu = cast(TypeTuple)t;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
264 n += dim(tu.arguments);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
265 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
266 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
267 n++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
268 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
269 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
270 return n;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
271 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
272
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
273 /***************************************
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
274 * Get nth Parameter, folding in tuples.
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
275 * Returns:
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
276 * Parameter nth Parameter
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
277 * null not found, *pn gets incremented by the number
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
278 * of Parameters
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
279 */
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
280 static Parameter getNth(Parameters args, size_t nth, size_t* pn = null)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
281 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
282 if (!args)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
283 return null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
284
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
285 size_t n = 0;
126
1765f3ef917d ClassDeclarations, Arguments -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
286 foreach (arg; args)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
287 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
288 Type t = arg.type.toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
289
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
290 if (t.ty == TY.Ttuple)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
291 { TypeTuple tu = cast(TypeTuple)t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
292 arg = getNth(tu.arguments, nth - n, &n);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
293 if (arg)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
294 return arg;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
295 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
296 else if (n == nth)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
297 return arg;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
298 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
299 n++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
300 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
301
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
302 if (pn)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
303 *pn += n;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
304
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
305 return null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
306 }
16
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
307 }