72
|
1 module dmd.RemoveExp;
|
|
2
|
|
3 import dmd.Expression;
|
|
4 import dmd.backend.elem;
|
|
5 import dmd.Loc;
|
|
6 import dmd.IRState;
|
|
7 import dmd.BinExp;
|
0
|
8 import dmd.TOK;
|
|
9 import dmd.Type;
|
|
10 import dmd.TypeAArray;
|
|
11 import dmd.TY;
|
|
12
|
|
13 import dmd.backend.Util;
|
|
14 import dmd.backend.OPER;
|
|
15 import dmd.backend.Symbol;
|
|
16 import dmd.backend.TYM;
|
72
|
17 import dmd.backend.mTY;
|
0
|
18
|
|
19 /* This deletes the key e1 from the associative array e2
|
|
20 */
|
72
|
21
|
0
|
22 class RemoveExp : BinExp
|
|
23 {
|
|
24 this(Loc loc, Expression e1, Expression e2)
|
|
25 {
|
|
26 super(loc, TOKremove, RemoveExp.sizeof, e1, e2);
|
|
27 type = Type.tvoid;
|
|
28 }
|
|
29
|
72
|
30 override elem* toElem(IRState* irs)
|
0
|
31 {
|
|
32 elem* e;
|
|
33 Type tb = e1.type.toBasetype();
|
|
34 assert(tb.ty == Taarray);
|
|
35 TypeAArray taa = cast(TypeAArray)tb;
|
|
36 elem* ea = e1.toElem(irs);
|
|
37 elem* ekey = e2.toElem(irs);
|
|
38 elem* ep;
|
|
39 elem* keyti;
|
|
40
|
|
41 if (tybasic(ekey.Ety) == TYstruct)
|
|
42 {
|
|
43 ekey = el_una(OPstrpar, TYstruct, ekey);
|
|
44 ekey.Enumbytes = ekey.E1.Enumbytes;
|
|
45 assert(ekey.Enumbytes);
|
|
46 }
|
|
47
|
|
48 Symbol* s = taa.aaGetSymbol("Del", 0);
|
|
49 keyti = taa.index.getInternalTypeInfo(null).toElem(irs);
|
|
50 ep = el_params(ekey, keyti, ea, null);
|
|
51 e = el_bin(OPcall, TYnptr, el_var(s), ep);
|
|
52
|
|
53 el_setLoc(e,loc);
|
|
54 return e;
|
|
55 }
|
|
56 }
|
|
57
|