annotate dmd/CommaExp.d @ 56:51605de93870

TupleExp.optimize UnrolledLoopStatement.ctor UnrolledLoopStatement.semantic UnrolledLoopStatement.blockExit OrOrExp.checkSideEffect FuncExp.syntaxCopy FuncLiteralDeclaration.syntaxCopy WhileStatement.hasBreak StructInitializer.toExpression StructLiteralExp.ctor StructLiteralExp.optimize BinExp.commonSemanticAssign ModAssignExp.opId Argument.isLazyArray CommaExp.implicitConvTo CommaExp.castTo TypeClass.isBaseOf createTypeInfoArray TypeTuple.getTypeInfoDeclaration TypeInfoTupleDeclaration.ctor TypeNext.constConv XorExp.implicitConvTo TemplateParameter.isTemplateValueParameter
author korDen
date Sat, 21 Aug 2010 14:16:53 +0400
parents 10317f0c89a5
children cab4c37afb89
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1 module dmd.CommaExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3 import dmd.Loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4 import dmd.BinExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5 import dmd.IRState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6 import dmd.Scope;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
7 import dmd.IntRange;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
8 import dmd.Expression;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
9 import dmd.MATCH;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
10 import dmd.WANT;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
11 import dmd.TOK;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
12 import dmd.Type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
13 import dmd.InterState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
14
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
15 import dmd.backend.elem;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
16 import dmd.backend.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
17
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
18 class CommaExp : BinExp
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
19 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
20 this(Loc loc, Expression e1, Expression e2)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
21 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
22 super(loc, TOK.TOKcomma, CommaExp.sizeof, e1, e2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
23 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
24
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
25 Expression semantic(Scope sc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
26 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
27 if (!type)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
28 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
29 BinExp.semanticp(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
30 type = e2.type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
31 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
32 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
33 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
34
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
35 void checkEscape()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
36 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
37 e2.checkEscape();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
38 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
39
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
40 IntRange getIntRange()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
41 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
42 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
43 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
44
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
45 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
46 int isLvalue()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
47 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
48 return e2.isLvalue();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
49 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
50 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
51 Expression toLvalue(Scope sc, Expression e)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
52 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
53 e2 = e2.toLvalue(sc, null);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
54 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
55 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
56
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
57 Expression modifiableLvalue(Scope sc, Expression e)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
58 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
59 e2 = e2.modifiableLvalue(sc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
60 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
61 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
62
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
63 bool isBool(bool result)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
64 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
65 return e2.isBool(result);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
66 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
67
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
68 bool checkSideEffect(int flag)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
69 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
70 if (flag == 2)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
71 return e1.checkSideEffect(2) || e2.checkSideEffect(2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
72 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
73 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
74 // Don't check e1 until we cast(void) the a,b code generation
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
75 return e2.checkSideEffect(flag);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
76 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
77 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
78
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
79 MATCH implicitConvTo(Type t)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
80 {
56
51605de93870 TupleExp.optimize
korDen
parents: 0
diff changeset
81 return e2.implicitConvTo(t);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
82 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
83
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
84 Expression castTo(Scope sc, Type t)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
85 {
56
51605de93870 TupleExp.optimize
korDen
parents: 0
diff changeset
86 Expression e2c = e2.castTo(sc, t);
51605de93870 TupleExp.optimize
korDen
parents: 0
diff changeset
87 Expression e;
51605de93870 TupleExp.optimize
korDen
parents: 0
diff changeset
88
51605de93870 TupleExp.optimize
korDen
parents: 0
diff changeset
89 if (e2c != e2)
51605de93870 TupleExp.optimize
korDen
parents: 0
diff changeset
90 {
51605de93870 TupleExp.optimize
korDen
parents: 0
diff changeset
91 e = new CommaExp(loc, e1, e2c);
51605de93870 TupleExp.optimize
korDen
parents: 0
diff changeset
92 e.type = e2c.type;
51605de93870 TupleExp.optimize
korDen
parents: 0
diff changeset
93 }
51605de93870 TupleExp.optimize
korDen
parents: 0
diff changeset
94 else
51605de93870 TupleExp.optimize
korDen
parents: 0
diff changeset
95 {
51605de93870 TupleExp.optimize
korDen
parents: 0
diff changeset
96 e = this;
51605de93870 TupleExp.optimize
korDen
parents: 0
diff changeset
97 e.type = e2.type;
51605de93870 TupleExp.optimize
korDen
parents: 0
diff changeset
98 }
51605de93870 TupleExp.optimize
korDen
parents: 0
diff changeset
99 return e;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
100 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
101
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
102 Expression optimize(int result)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
103 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
104 Expression e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
105
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
106 //printf("CommaExp.optimize(result = %d) %s\n", result, toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
107 e1 = e1.optimize(result & WANTinterpret);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
108 e2 = e2.optimize(result);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
109 if (!e1 || e1.op == TOKint64 || e1.op == TOKfloat64 || !e1.checkSideEffect(2))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
110 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
111 e = e2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
112 if (e)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
113 e.type = type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
114 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
115 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
116 e = this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
117 //printf("-CommaExp.optimize(result = %d) %s\n", result, e.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
118 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
119 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
120
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
121 Expression interpret(InterState* istate)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
122 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
123 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
124 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
125
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
126 elem* toElem(IRState* irs)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
127 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
128 assert(e1 && e2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
129 elem* eleft = e1.toElem(irs);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
130 elem* eright = e2.toElem(irs);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
131 elem* e = el_combine(eleft, eright);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
132 if (e)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
133 el_setLoc(e, loc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
134 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
135 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
136 }