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