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