annotate dmd/NullExp.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
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
1 module dmd.NullExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
2
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 72
diff changeset
3 import dmd.common;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
4 import dmd.Expression;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
5 import dmd.backend.elem;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
6 import dmd.InterState;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
7 import dmd.MATCH;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
8 import dmd.Type;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
9 import dmd.TY;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
10 import dmd.TypeTypedef;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
11 import dmd.OutBuffer;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
12 import dmd.Loc;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
13 import dmd.Scope;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
14 import dmd.IRState;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
15 import dmd.HdrGenState;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
16 import dmd.TOK;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
17 import dmd.backend.dt_t;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
18 import dmd.backend.Util;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
19
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
20 class NullExp : Expression
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
21 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
22 ubyte committed;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
23
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 123
diff changeset
24 this(Loc loc, Type type = null)
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
25 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 135
diff changeset
26 register();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
27 super(loc, TOK.TOKnull, NullExp.sizeof);
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 123
diff changeset
28 this.type = type;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
29 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
30
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
31 override Expression semantic(Scope sc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
32 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
33 version (LOGSEMANTIC) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
34 printf("NullExp.semantic('%s')\n", toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
35 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
36 // null is the same as (void*)0
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
37 if (!type)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
38 type = Type.tvoid.pointerTo();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
39
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
40 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
41 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
42
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
43 override bool isBool(bool result)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
44 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
45 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
46 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
47
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
48 override int isConst()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
49 {
63
cab4c37afb89 A bunch of implementations
korDen
parents: 0
diff changeset
50 return 0;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
51 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
52
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
53 override void toCBuffer(OutBuffer buf, HdrGenState* hgs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
54 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
55 buf.writestring("null");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
56 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
57
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
58 override void toMangleBuffer(OutBuffer buf)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
59 {
64
4290d870944a More fixes
korDen
parents: 63
diff changeset
60 buf.writeByte('n');
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
61 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
62
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
63 override MATCH implicitConvTo(Type t)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
64 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
65 static if (false) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
66 printf("NullExp.implicitConvTo(this=%s, type=%s, t=%s, committed = %d)\n",
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
67 toChars(), type.toChars(), t.toChars(), committed);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
68 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
69 if (this.type.equals(t))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
70 return MATCH.MATCHexact;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
71
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
72 /* Allow implicit conversions from invariant to mutable|const,
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
73 * and mutable to invariant. It works because, after all, a null
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
74 * doesn't actually point to anything.
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
75 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
76 if (t.invariantOf().equals(type.invariantOf()))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
77 return MATCH.MATCHconst;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
78
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
79 // null implicitly converts to any pointer type or dynamic array
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
80 if (type.ty == TY.Tpointer && type.nextOf().ty == TY.Tvoid)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
81 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
82 if (t.ty == TY.Ttypedef)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
83 t = (cast(TypeTypedef)t).sym.basetype;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
84 if (t.ty == TY.Tpointer || t.ty == TY.Tarray ||
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
85 t.ty == TY.Taarray || t.ty == TY.Tclass ||
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
86 t.ty == TY.Tdelegate)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
87 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
88 return committed ? MATCH.MATCHconvert : MATCH.MATCHexact;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
89 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
90 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
91
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
92 return Expression.implicitConvTo(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
93 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
94
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
95 override Expression castTo(Scope sc, Type t)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
96 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
97 NullExp e;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
98 Type tb;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
99
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
100 //printf("NullExp::castTo(t = %p)\n", t);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
101 if (type is t)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
102 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
103 committed = 1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
104 return this;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
105 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
106
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
107 e = cast(NullExp)copy();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
108 e.committed = 1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
109 tb = t.toBasetype();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
110 e.type = type.toBasetype();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
111
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
112 if (tb !is e.type)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
113 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
114 // null implicitly converts to any pointer type or dynamic array
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
115 if (e.type.ty == TY.Tpointer && e.type.nextOf().ty == TY.Tvoid &&
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
116 (tb.ty == TY.Tpointer || tb.ty == TY.Tarray || tb.ty == TY.Taarray ||
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
117 tb.ty == TY.Tdelegate))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
118 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
119 static if (false) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
120 if (tb.ty == TY.Tdelegate)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
121 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
122 TypeDelegate td = cast(TypeDelegate)tb;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
123 TypeFunction tf = cast(TypeFunction)td.nextOf();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
124
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
125 if (!tf.varargs && !(tf.arguments && tf.arguments.dim))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
126 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
127 return Expression.castTo(sc, t);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
128 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
129 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
130 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
131 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
132 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
133 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
134 return e.Expression.castTo(sc, t);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
135 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
136 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
137 e.type = t;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
138 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
139 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
140
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
141 override Expression interpret(InterState istate)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
142 {
123
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
143 return this;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
144 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
145
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
146 override elem* toElem(IRState* irs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
147 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
148 return el_long(type.totym(), 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
149 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
150
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
151 override dt_t** toDt(dt_t** pdt)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
152 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
153 assert(type);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
154 return dtnzeros(pdt, cast(uint)type.size());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
155 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
156 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
157