Mercurial > projects > ddmd
annotate dmd/InExp.d @ 114:e28b18c23469
added a module dmd.common for commonly used stuff
it currently holds code for consistency checking of predefined versions
also added a VisualD project file
author | Trass3r |
---|---|
date | Wed, 01 Sep 2010 18:21:58 +0200 |
parents | 43073c7c7769 |
children | e3afd1303184 |
rev | line source |
---|---|
72 | 1 module dmd.InExp; |
2 | |
114 | 3 import dmd.common; |
72 | 4 import dmd.Expression; |
5 import dmd.Identifier; | |
6 import dmd.Loc; | |
7 import dmd.Scope; | |
8 import dmd.IRState; | |
9 import dmd.BinExp; | |
8
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
10 import dmd.TOK; |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
11 import dmd.Type; |
72 | 12 import dmd.Id; |
8
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
13 import dmd.TY; |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
14 import dmd.TypeAArray; |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
15 |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
16 import dmd.expression.util.arrayTypeCompatible; |
72 | 17 |
18 import dmd.backend.elem; | |
19 import dmd.backend.TYM; | |
20 import dmd.backend.mTY; | |
21 import dmd.backend.OPER; | |
22 import dmd.backend.Symbol; | |
23 import dmd.backend.Util; | |
24 | |
0 | 25 class InExp : BinExp |
26 { | |
27 this(Loc loc, Expression e1, Expression e2) | |
28 { | |
8
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
29 super(loc, TOKin, InExp.sizeof, e1, e2); |
0 | 30 } |
31 | |
72 | 32 override Expression semantic(Scope sc) |
0 | 33 { |
8
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
34 if (type) |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
35 return this; |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
36 |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
37 super.semanticp(sc); |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
38 |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
39 Expression e = op_overload(sc); |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
40 if (e) |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
41 return e; |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
42 |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
43 //type = Type.tboolean; |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
44 Type t2b = e2.type.toBasetype(); |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
45 if (t2b.ty != TY.Taarray) |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
46 { |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
47 error("rvalue of in expression must be an associative array, not %s", e2.type.toChars()); |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
48 type = Type.terror; |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
49 } |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
50 else |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
51 { |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
52 TypeAArray ta = cast(TypeAArray)t2b; |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
53 |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
54 // Special handling for array keys |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
55 if (!arrayTypeCompatible(e1.loc, e1.type, ta.index)) |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
56 { |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
57 // Convert key to type of key |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
58 e1 = e1.implicitCastTo(sc, ta.index); |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
59 } |
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 // Return type is pointer to value |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
62 type = ta.nextOf().pointerTo(); |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
63 } |
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
64 return this; |
0 | 65 } |
66 | |
72 | 67 override int isBit() |
0 | 68 { |
8
d42cd5917df4
wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents:
0
diff
changeset
|
69 return 0; |
0 | 70 } |
71 | |
72 | 72 override Identifier opId() |
0 | 73 { |
61 | 74 return Id.opIn; |
0 | 75 } |
76 | |
72 | 77 override Identifier opId_r() |
0 | 78 { |
62 | 79 return Id.opIn_r; |
0 | 80 } |
81 | |
72 | 82 override elem* toElem(IRState* irs) |
0 | 83 { |
72 | 84 elem* e; |
85 elem* key = e1.toElem(irs); | |
86 elem* aa = e2.toElem(irs); | |
87 elem* ep; | |
88 elem* keyti; | |
89 TypeAArray taa = cast(TypeAArray)e2.type.toBasetype(); | |
90 | |
91 | |
92 // set to: | |
93 // aaIn(aa, keyti, key); | |
94 | |
95 if (tybasic(key.Ety) == TYstruct) | |
96 { | |
97 key = el_una(OPstrpar, TYstruct, key); | |
98 key.Enumbytes = key.E1.Enumbytes; | |
99 assert(key.Enumbytes); | |
100 } | |
79 | 101 else if (tybasic(key.Ety) == TYarray && taa.index.ty == Tsarray) |
102 { | |
103 // e2.elem() turns string literals into a TYarray, so the | |
104 // length is lost. Restore it. | |
105 key = el_una(OPstrpar, TYstruct, key); | |
106 assert(e1.type.size() == taa.index.size()); | |
107 key.Enumbytes = cast(size_t) taa.index.size(); | |
108 } | |
72 | 109 |
110 Symbol* s = taa.aaGetSymbol("In", 0); | |
111 keyti = taa.index.getInternalTypeInfo(null).toElem(irs); | |
112 ep = el_params(key, keyti, aa, null); | |
113 e = el_bin(OPcall, type.totym(), el_var(s), ep); | |
114 | |
115 el_setLoc(e,loc); | |
67 | 116 return e; |
0 | 117 } |
118 } | |
119 |