1 //**************************************************************************
2 //**
3 //** ## ## ## ## ## #### #### ### ###
4 //** ## ## ## ## ## ## ## ## ## ## #### ####
5 //** ## ## ## ## ## ## ## ## ## ## ## ## ## ##
6 //** ## ## ######## ## ## ## ## ## ## ## ### ##
7 //** ### ## ## ### ## ## ## ## ## ##
8 //** # ## ## # #### #### ## ##
9 //**
10 //** $Id: vc_expr_base.cpp 4297 2010-06-03 22:49:00Z firebrand_kh $
11 //**
12 //** Copyright (C) 1999-2006 Jānis Legzdiņš
13 //**
14 //** This program is free software; you can redistribute it and/or
15 //** modify it under the terms of the GNU General Public License
16 //** as published by the Free Software Foundation; either version 2
17 //** of the License, or (at your option) any later version.
18 //**
19 //** This program is distributed in the hope that it will be useful,
20 //** but WITHOUT ANY WARRANTY; without even the implied warranty of
21 //** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 //** GNU General Public License for more details.
23 //**
24 //**************************************************************************
25
26 // HEADER FILES ------------------------------------------------------------
27
28 #include "vc_local.h"
29
30 // MACROS ------------------------------------------------------------------
31
32 // TYPES -------------------------------------------------------------------
33
34 // EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
35
36 // PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
37
38 // PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
39
40 // EXTERNAL DATA DECLARATIONS ----------------------------------------------
41
42 // PUBLIC DATA DEFINITIONS -------------------------------------------------
43
44 // PRIVATE DATA DEFINITIONS ------------------------------------------------
45
46 // CODE --------------------------------------------------------------------
47
48 //==========================================================================
49 //
50 // VExpression::VExpression
51 //
52 //==========================================================================
53
VExpression(const TLocation & ALoc)54 VExpression::VExpression(const TLocation& ALoc)
55 : Type(TYPE_Void)
56 , RealType(TYPE_Void)
57 , Flags(0)
58 , Loc(ALoc)
59 {
60 }
61
62 //==========================================================================
63 //
64 // VExpression::~VExpression
65 //
66 //==========================================================================
67
~VExpression()68 VExpression::~VExpression()
69 {
70 }
71
72 //==========================================================================
73 //
74 // VExpression::Resolve
75 //
76 //==========================================================================
77
Resolve(VEmitContext & ec)78 VExpression* VExpression::Resolve(VEmitContext& ec)
79 {
80 VExpression* e = DoResolve(ec);
81 return e;
82 }
83
84 //==========================================================================
85 //
86 // VExpression::ResolveBoolean
87 //
88 //==========================================================================
89
ResolveBoolean(VEmitContext & ec)90 VExpression* VExpression::ResolveBoolean(VEmitContext& ec)
91 {
92 VExpression* e = Resolve(ec);
93 if (!e)
94 {
95 return NULL;
96 }
97
98 switch (e->Type.Type)
99 {
100 case TYPE_Int:
101 case TYPE_Byte:
102 case TYPE_Bool:
103 case TYPE_Float:
104 case TYPE_Name:
105 break;
106
107 case TYPE_Pointer:
108 case TYPE_Reference:
109 case TYPE_Class:
110 case TYPE_State:
111 e = new VPointerToBool(e);
112 break;
113
114 case TYPE_String:
115 e = new VStringToBool(e);
116 break;
117
118 case TYPE_Delegate:
119 e = new VDelegateToBool(e);
120 break;
121
122 default:
123 ParseError(Loc, "Expression type mistmatch, boolean expression expected");
124 delete e;
125 e = NULL;
126 return NULL;
127 }
128 return e;
129 }
130
131 //==========================================================================
132 //
133 // VExpression::ResolveAsType
134 //
135 //==========================================================================
136
ResolveAsType(VEmitContext &)137 VTypeExpr* VExpression::ResolveAsType(VEmitContext&)
138 {
139 ParseError(Loc, "Invalid type expression");
140 delete this;
141 return NULL;
142 }
143
144 //==========================================================================
145 //
146 // VExpression::ResolveAssignmentTarget
147 //
148 //==========================================================================
149
ResolveAssignmentTarget(VEmitContext & ec)150 VExpression* VExpression::ResolveAssignmentTarget(VEmitContext& ec)
151 {
152 return Resolve(ec);
153 }
154
155 //==========================================================================
156 //
157 // VExpression::ResolveIterator
158 //
159 //==========================================================================
160
ResolveIterator(VEmitContext &)161 VExpression* VExpression::ResolveIterator(VEmitContext&)
162 {
163 ParseError(Loc, "Iterator method expected");
164 delete this;
165 return NULL;
166 }
167
168 //==========================================================================
169 //
170 // VExpression::RequestAddressOf
171 //
172 //==========================================================================
173
RequestAddressOf()174 void VExpression::RequestAddressOf()
175 {
176 ParseError(Loc, "Bad address operation");
177 }
178
179 //==========================================================================
180 //
181 // VExpression::EmitBranchable
182 //
183 //==========================================================================
184
EmitBranchable(VEmitContext & ec,VLabel Lbl,bool OnTrue)185 void VExpression::EmitBranchable(VEmitContext& ec, VLabel Lbl, bool OnTrue)
186 {
187 Emit(ec);
188 if (OnTrue)
189 {
190 ec.AddStatement(OPC_IfGoto, Lbl);
191 }
192 else
193 {
194 ec.AddStatement(OPC_IfNotGoto, Lbl);
195 }
196 }
197
198 //==========================================================================
199 //
200 // VExpression::EmitPushPointedCode
201 //
202 //==========================================================================
203
EmitPushPointedCode(VFieldType type,VEmitContext & ec)204 void VExpression::EmitPushPointedCode(VFieldType type, VEmitContext& ec)
205 {
206 switch (type.Type)
207 {
208 case TYPE_Int:
209 case TYPE_Float:
210 case TYPE_Name:
211 ec.AddStatement(OPC_PushPointed);
212 break;
213
214 case TYPE_Byte:
215 ec.AddStatement(OPC_PushPointedByte);
216 break;
217
218 case TYPE_Bool:
219 if (type.BitMask & 0x000000ff)
220 ec.AddStatement(OPC_PushBool0, (int)(type.BitMask));
221 else if (type.BitMask & 0x0000ff00)
222 ec.AddStatement(OPC_PushBool1, (int)(type.BitMask >> 8));
223 else if (type.BitMask & 0x00ff0000)
224 ec.AddStatement(OPC_PushBool2, (int)(type.BitMask >> 16));
225 else
226 ec.AddStatement(OPC_PushBool3, (int)(type.BitMask >> 24));
227 break;
228
229 case TYPE_Pointer:
230 case TYPE_Reference:
231 case TYPE_Class:
232 case TYPE_State:
233 ec.AddStatement(OPC_PushPointedPtr);
234 break;
235
236 case TYPE_Vector:
237 ec.AddStatement(OPC_VPushPointed);
238 break;
239
240 case TYPE_String:
241 ec.AddStatement(OPC_PushPointedStr);
242 break;
243
244 case TYPE_Delegate:
245 ec.AddStatement(OPC_PushPointedDelegate);
246 break;
247
248 default:
249 ParseError(Loc, "Bad push pointed");
250 }
251 }
252
253 //==========================================================================
254 //
255 // VExpression::IsValidTypeExpression
256 //
257 //==========================================================================
258
IsValidTypeExpression()259 bool VExpression::IsValidTypeExpression()
260 {
261 return false;
262 }
263
264 //==========================================================================
265 //
266 // VExpression::IsIntConst
267 //
268 //==========================================================================
269
IsIntConst() const270 bool VExpression::IsIntConst() const
271 {
272 return false;
273 }
274
275 //==========================================================================
276 //
277 // VExpression::IsFloatConst
278 //
279 //==========================================================================
280
IsFloatConst() const281 bool VExpression::IsFloatConst() const
282 {
283 return false;
284 }
285
286 //==========================================================================
287 //
288 // VExpression::IsStrConst
289 //
290 //==========================================================================
291
IsStrConst() const292 bool VExpression::IsStrConst() const
293 {
294 return false;
295 }
296
297 //==========================================================================
298 //
299 // VExpression::GetIntConst
300 //
301 //==========================================================================
302
GetIntConst() const303 vint32 VExpression::GetIntConst() const
304 {
305 ParseError(Loc, "Integer constant expected");
306 return 0;
307 }
308
309 //==========================================================================
310 //
311 // VExpression::GetFloatConst
312 //
313 //==========================================================================
314
GetFloatConst() const315 float VExpression::GetFloatConst() const
316 {
317 ParseError(Loc, "Float constant expected");
318 return 0.0;
319 }
320
321 //==========================================================================
322 //
323 // VExpression::GetStrConst
324 //
325 //==========================================================================
326
GetStrConst(VPackage *) const327 VStr VExpression::GetStrConst(VPackage*) const
328 {
329 ParseError(Loc, "String constant expected");
330 return VStr();
331 }
332
333 //==========================================================================
334 //
335 // VExpression::IsDefaultObject
336 //
337 //==========================================================================
338
IsDefaultObject() const339 bool VExpression::IsDefaultObject() const
340 {
341 return false;
342 }
343
344 //==========================================================================
345 //
346 // VExpression::IsPropertyAssign
347 //
348 //==========================================================================
349
IsPropertyAssign() const350 bool VExpression::IsPropertyAssign() const
351 {
352 return false;
353 }
354
355 //==========================================================================
356 //
357 // VExpression::IsDynArraySetNum
358 //
359 //==========================================================================
360
IsDynArraySetNum() const361 bool VExpression::IsDynArraySetNum() const
362 {
363 return false;
364 }
365
366 //==========================================================================
367 //
368 // VExpression::CreateTypeExprCopy
369 //
370 //==========================================================================
371
CreateTypeExprCopy()372 VExpression* VExpression::CreateTypeExprCopy()
373 {
374 ParseError(Loc, "Not a type");
375 return new VTypeExpr(TYPE_Unknown, Loc);
376 }
377
378 //==========================================================================
379 //
380 // VExpression::AddDropResult
381 //
382 //==========================================================================
383
AddDropResult()384 bool VExpression::AddDropResult()
385 {
386 return false;
387 }
388
389 //==========================================================================
390 //
391 // VExpression::IsDecorateSingleName
392 //
393 //==========================================================================
394
IsDecorateSingleName() const395 bool VExpression::IsDecorateSingleName() const
396 {
397 return false;
398 }
399