1 //**************************************************************************
2 //**
3 //**	##   ##    ##    ##   ##   ####     ####   ###     ###
4 //**	##   ##  ##  ##  ##   ##  ##  ##   ##  ##  ####   ####
5 //**	 ## ##  ##    ##  ## ##  ##    ## ##    ## ## ## ## ##
6 //**	 ## ##  ########  ## ##  ##    ## ##    ## ##  ###  ##
7 //**	  ###   ##    ##   ###    ##  ##   ##  ##  ##       ##
8 //**	   #    ##    ##    #      ####     ####   ##       ##
9 //**
10 //**	$Id: vc_expr_literal.cpp 3764 2008-09-09 20:52:59Z dj_jl $
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 //	VIntLiteral::VIntLiteral
51 //
52 //==========================================================================
53 
VIntLiteral(vint32 AValue,const TLocation & ALoc)54 VIntLiteral::VIntLiteral(vint32 AValue, const TLocation& ALoc)
55 : VExpression(ALoc)
56 , Value(AValue)
57 {
58 	Type = TYPE_Int;
59 }
60 
61 //==========================================================================
62 //
63 //	VIntLiteral::DoResolve
64 //
65 //==========================================================================
66 
DoResolve(VEmitContext &)67 VExpression* VIntLiteral::DoResolve(VEmitContext&)
68 {
69 	return this;
70 }
71 
72 //==========================================================================
73 //
74 //	VIntLiteral::Emit
75 //
76 //==========================================================================
77 
Emit(VEmitContext & ec)78 void VIntLiteral::Emit(VEmitContext& ec)
79 {
80 	ec.EmitPushNumber(Value);
81 }
82 
83 //==========================================================================
84 //
85 //	VIntLiteral::GetIntConst
86 //
87 //==========================================================================
88 
GetIntConst() const89 vint32 VIntLiteral::GetIntConst() const
90 {
91 	return Value;
92 }
93 
94 //==========================================================================
95 //
96 //	VIntLiteral::IsIntConst
97 //
98 //==========================================================================
99 
IsIntConst() const100 bool VIntLiteral::IsIntConst() const
101 {
102 	return true;
103 }
104 
105 //==========================================================================
106 //
107 //	VFloatLiteral::VFloatLiteral
108 //
109 //==========================================================================
110 
VFloatLiteral(float AValue,const TLocation & ALoc)111 VFloatLiteral::VFloatLiteral(float AValue, const TLocation& ALoc)
112 : VExpression(ALoc)
113 , Value(AValue)
114 {
115 	Type = TYPE_Float;
116 }
117 
118 //==========================================================================
119 //
120 //	VFloatLiteral::DoResolve
121 //
122 //==========================================================================
123 
DoResolve(VEmitContext &)124 VExpression* VFloatLiteral::DoResolve(VEmitContext&)
125 {
126 	return this;
127 }
128 
129 //==========================================================================
130 //
131 //	VFloatLiteral::Emit
132 //
133 //==========================================================================
134 
Emit(VEmitContext & ec)135 void VFloatLiteral::Emit(VEmitContext& ec)
136 {
137 	ec.AddStatement(OPC_PushNumber, Value);
138 }
139 
140 //==========================================================================
141 //
142 //	VFloatLiteral::IsFloatConst
143 //
144 //==========================================================================
145 
IsFloatConst() const146 bool VFloatLiteral::IsFloatConst() const
147 {
148 	return true;
149 }
150 
151 //==========================================================================
152 //
153 //	VFloatLiteral::GetFloatConst
154 //
155 //==========================================================================
156 
GetFloatConst() const157 float VFloatLiteral::GetFloatConst() const
158 {
159 	return Value;
160 }
161 
162 //==========================================================================
163 //
164 //	VNameLiteral::VNameLiteral
165 //
166 //==========================================================================
167 
VNameLiteral(VName AValue,const TLocation & ALoc)168 VNameLiteral::VNameLiteral(VName AValue, const TLocation& ALoc)
169 : VExpression(ALoc)
170 , Value(AValue)
171 {
172 	Type = TYPE_Name;
173 }
174 
175 //==========================================================================
176 //
177 //	VNameLiteral::DoResolve
178 //
179 //==========================================================================
180 
DoResolve(VEmitContext &)181 VExpression* VNameLiteral::DoResolve(VEmitContext&)
182 {
183 	return this;
184 }
185 
186 //==========================================================================
187 //
188 //	VNameLiteral::Emit
189 //
190 //==========================================================================
191 
Emit(VEmitContext & ec)192 void VNameLiteral::Emit(VEmitContext& ec)
193 {
194 	ec.AddStatement(OPC_PushName, Value);
195 }
196 
197 //==========================================================================
198 //
199 //	VStringLiteral::VStringLiteral
200 //
201 //==========================================================================
202 
VStringLiteral(vint32 AValue,const TLocation & ALoc)203 VStringLiteral::VStringLiteral(vint32 AValue, const TLocation& ALoc)
204 : VExpression(ALoc)
205 , Value(AValue)
206 {
207 	Type = TYPE_String;
208 }
209 
210 //==========================================================================
211 //
212 //	VStringLiteral::DoResolve
213 //
214 //==========================================================================
215 
DoResolve(VEmitContext &)216 VExpression* VStringLiteral::DoResolve(VEmitContext&)
217 {
218 	return this;
219 }
220 
221 //==========================================================================
222 //
223 //	VStringLiteral::Emit
224 //
225 //==========================================================================
226 
Emit(VEmitContext & ec)227 void VStringLiteral::Emit(VEmitContext& ec)
228 {
229 	ec.AddStatement(OPC_PushString, Value);
230 }
231 
232 //==========================================================================
233 //
234 //	VStringLiteral::IsStrConst
235 //
236 //==========================================================================
237 
IsStrConst() const238 bool VStringLiteral::IsStrConst() const
239 {
240 	return true;
241 }
242 
243 //==========================================================================
244 //
245 //	VStringLiteral::GetStrConst
246 //
247 //==========================================================================
248 
GetStrConst(VPackage * Pkg) const249 VStr VStringLiteral::GetStrConst(VPackage* Pkg) const
250 {
251 	return &Pkg->Strings[Value];
252 }
253 
254 //==========================================================================
255 //
256 //	VSelf::VSelf
257 //
258 //==========================================================================
259 
VSelf(const TLocation & ALoc)260 VSelf::VSelf(const TLocation& ALoc)
261 : VExpression(ALoc)
262 {
263 }
264 
265 //==========================================================================
266 //
267 //	VSelf::DoResolve
268 //
269 //==========================================================================
270 
DoResolve(VEmitContext & ec)271 VExpression* VSelf::DoResolve(VEmitContext& ec)
272 {
273 	if (!ec.SelfClass)
274 	{
275 		ParseError(Loc, "self used outside member function\n");
276 		delete this;
277 		return NULL;
278 	}
279 	if (ec.CurrentFunc->Flags & FUNC_Static)
280 	{
281 		ParseError(Loc, "self used in a static method\n");
282 		delete this;
283 		return NULL;
284 	}
285 	Type = VFieldType(ec.SelfClass);
286 	return this;
287 }
288 
289 //==========================================================================
290 //
291 //	VSelf::Emit
292 //
293 //==========================================================================
294 
Emit(VEmitContext & ec)295 void VSelf::Emit(VEmitContext& ec)
296 {
297 	ec.AddStatement(OPC_LocalValue0);
298 }
299 
300 //==========================================================================
301 //
302 //	VNoneLiteral::VNoneLiteral
303 //
304 //==========================================================================
305 
VNoneLiteral(const TLocation & ALoc)306 VNoneLiteral::VNoneLiteral(const TLocation& ALoc)
307 : VExpression(ALoc)
308 {
309 	Type = VFieldType((VClass*)NULL);
310 }
311 
312 //==========================================================================
313 //
314 //	VNoneLiteral::DoResolve
315 //
316 //==========================================================================
317 
DoResolve(VEmitContext &)318 VExpression* VNoneLiteral::DoResolve(VEmitContext&)
319 {
320 	return this;
321 }
322 
323 //==========================================================================
324 //
325 //	VNoneLiteral::Emit
326 //
327 //==========================================================================
328 
Emit(VEmitContext & ec)329 void VNoneLiteral::Emit(VEmitContext& ec)
330 {
331 	ec.AddStatement(OPC_PushNull);
332 }
333 
334 //==========================================================================
335 //
336 //	VNullLiteral::VNullLiteral
337 //
338 //==========================================================================
339 
VNullLiteral(const TLocation & ALoc)340 VNullLiteral::VNullLiteral(const TLocation& ALoc)
341 : VExpression(ALoc)
342 {
343 	Type = VFieldType(TYPE_Void).MakePointerType();
344 }
345 
346 //==========================================================================
347 //
348 //	VNullLiteral::DoResolve
349 //
350 //==========================================================================
351 
DoResolve(VEmitContext &)352 VExpression* VNullLiteral::DoResolve(VEmitContext&)
353 {
354 	return this;
355 }
356 
357 //==========================================================================
358 //
359 //	VNullLiteral::Emit
360 //
361 //==========================================================================
362 
Emit(VEmitContext & ec)363 void VNullLiteral::Emit(VEmitContext& ec)
364 {
365 	ec.AddStatement(OPC_PushNull);
366 }
367