annotate dmd/TypeSlice.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 60bb0fe4563e
children b0d41ff5e0df
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1 module dmd.TypeSlice;
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.Type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5 import dmd.TypeNext;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6 import dmd.MOD;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
7 import dmd.Expression;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
8 import dmd.Loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
9 import dmd.Scope;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
10 import dmd.Dsymbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
11 import dmd.OutBuffer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
12 import dmd.HdrGenState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
13 import dmd.TY;
8
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
14 import dmd.TypeTuple;
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
15 import dmd.WANT;
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
16 import dmd.ArrayTypes;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
17 import dmd.Parameter;
37
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
18 import dmd.SliceExp;
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
19 import dmd.TupleDeclaration;
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
20 import dmd.ScopeDsymbol;
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
21 import dmd.ArrayScopeSymbol;
8
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
22
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
23 import dmd.type.Util;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
24
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
25 class TypeSlice : TypeNext
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
26 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
27 Expression lwr;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
28 Expression upr;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
29
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
30 this(Type next, Expression lwr, Expression upr)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
31 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 130
diff changeset
32 register();
8
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
33 super(TY.Tslice, next);
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
34 //printf("TypeSlice[%s .. %s]\n", lwr.toChars(), upr.toChars());
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
35 this.lwr = lwr;
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
36 this.upr = upr;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
37 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
38
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 37
diff changeset
39 override Type syntaxCopy()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
40 {
8
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
41 Type t = new TypeSlice(next.syntaxCopy(), lwr.syntaxCopy(), upr.syntaxCopy());
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
42 t.mod = mod;
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
43 return t;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
44 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
45
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 37
diff changeset
46 override Type semantic(Loc loc, Scope sc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
47 {
8
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
48 //printf("TypeSlice.semantic() %s\n", toChars());
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
49 next = next.semantic(loc, sc);
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
50 transitive();
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
51 //printf("next: %s\n", next.toChars());
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
52
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
53 Type tbn = next.toBasetype();
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
54 if (tbn.ty != Ttuple)
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
55 {
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
56 error(loc, "can only slice tuple types, not %s", tbn.toChars());
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
57 return Type.terror;
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
58 }
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
59 TypeTuple tt = cast(TypeTuple)tbn;
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
60
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
61 lwr = semanticLength(sc, tbn, lwr);
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
62 lwr = lwr.optimize(WANTvalue);
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
63 ulong i1 = lwr.toUInteger();
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
64
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
65 upr = semanticLength(sc, tbn, upr);
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
66 upr = upr.optimize(WANTvalue);
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
67 ulong i2 = upr.toUInteger();
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
68
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
69 if (!(i1 <= i2 && i2 <= tt.arguments.dim))
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
70 {
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
71 error(loc, "slice [%ju..%ju] is out of range of [0..%u]", i1, i2, tt.arguments.dim);
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
72 return Type.terror;
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
73 }
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
74
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
75 auto args = new Parameters;
8
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
76 args.reserve(cast(size_t)(i2 - i1));
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
77 for (size_t i = cast(size_t)i1; i < cast(size_t)i2; i++)
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
78 {
126
1765f3ef917d ClassDeclarations, Arguments -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
79 auto arg = tt.arguments[i];
1765f3ef917d ClassDeclarations, Arguments -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
80 args.push(arg);
8
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
81 }
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
82
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
83 return new TypeTuple(args);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
84 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
85
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 37
diff changeset
86 override void resolve(Loc loc, Scope sc, Expression* pe, Type* pt, Dsymbol* ps)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
87 {
37
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
88 next.resolve(loc, sc, pe, pt, ps);
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
89 if (*pe)
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
90 { // It's really a slice expression
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
91 Expression e;
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
92 e = new SliceExp(loc, *pe, lwr, upr);
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
93 *pe = e;
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
94 }
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
95 else if (*ps)
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
96 {
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
97 Dsymbol s = *ps;
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
98 TupleDeclaration td = s.isTupleDeclaration();
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
99 if (td)
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
100 {
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
101 /* It's a slice of a TupleDeclaration
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
102 */
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
103 ScopeDsymbol sym = new ArrayScopeSymbol(sc, td);
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
104 sym.parent = sc.scopesym;
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
105 sc = sc.push(sym);
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
106
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
107 lwr = lwr.semantic(sc);
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
108 lwr = lwr.optimize(WANTvalue);
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
109 ulong i1 = lwr.toUInteger();
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
110
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
111 upr = upr.semantic(sc);
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
112 upr = upr.optimize(WANTvalue);
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
113 ulong i2 = upr.toUInteger();
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
114
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
115 sc = sc.pop();
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
116
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
117 if (!(i1 <= i2 && i2 <= td.objects.dim))
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
118 {
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
119 error(loc, "slice [%ju..%ju] is out of range of [0..%u]", i1, i2, td.objects.dim);
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
120 goto Ldefault;
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
121 }
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
122
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
123 if (i1 == 0 && i2 == td.objects.dim)
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
124 {
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
125 *ps = td;
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
126 return;
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
127 }
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
128
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
129 /* Create a new TupleDeclaration which
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
130 * is a slice [i1..i2] out of the old one.
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
131 */
113
3482c73a991b More cleanup for arrays
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
132 auto objects = new Objects;
37
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
133 objects.setDim(cast(uint)(i2 - i1));
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
134 for (size_t i = 0; i < objects.dim; i++)
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
135 {
113
3482c73a991b More cleanup for arrays
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
136 objects[i] = td.objects[cast(size_t)i1 + i];
37
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
137 }
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
138
113
3482c73a991b More cleanup for arrays
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
139 auto tds = new TupleDeclaration(loc, td.ident, objects);
37
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
140 *ps = tds;
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
141 }
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
142 else
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
143 goto Ldefault;
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
144 }
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
145 else
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
146 {
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
147 Ldefault:
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
148 Type.resolve(loc, sc, pe, pt, ps);
38a17310d587 TypeSlice::resolve() implemented
korDen
parents: 8
diff changeset
149 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
150 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
151
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 37
diff changeset
152 override void toCBuffer2(OutBuffer buf, HdrGenState* hgs, MOD mod)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
153 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
154 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
155 }
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 37
diff changeset
156 }