1 //**************************************************************************
2 //**
3 //**	##   ##    ##    ##   ##   ####     ####   ###     ###
4 //**	##   ##  ##  ##  ##   ##  ##  ##   ##  ##  ####   ####
5 //**	 ## ##  ##    ##  ## ##  ##    ## ##    ## ## ## ## ##
6 //**	 ## ##  ########  ## ##  ##    ## ##    ## ##  ###  ##
7 //**	  ###   ##    ##   ###    ##  ##   ##  ##  ##       ##
8 //**	   #    ##    ##    #      ####     ####   ##       ##
9 //**
10 //**	$Id: progdefs.h 4360 2010-12-30 19:22:35Z 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 #ifndef OPCODE_INFO
27 
28 #define PROG_MAGIC		"VPRG"
29 #define PROG_VERSION	33
30 
31 enum
32 {
33 	OPCARGS_None,
34 	OPCARGS_Member,
35 	OPCARGS_BranchTargetB,
36 	OPCARGS_BranchTargetNB,
37 	OPCARGS_BranchTargetS,
38 	OPCARGS_BranchTarget,
39 	OPCARGS_ByteBranchTarget,
40 	OPCARGS_ShortBranchTarget,
41 	OPCARGS_IntBranchTarget,
42 	OPCARGS_Byte,
43 	OPCARGS_Short,
44 	OPCARGS_Int,
45 	OPCARGS_Name,
46 	OPCARGS_NameS,
47 	OPCARGS_NameB,
48 	OPCARGS_String,
49 	OPCARGS_FieldOffset,
50 	OPCARGS_FieldOffsetS,
51 	OPCARGS_FieldOffsetB,
52 	OPCARGS_VTableIndex,
53 	OPCARGS_VTableIndexB,
54 	OPCARGS_TypeSize,
55 	OPCARGS_TypeSizeS,
56 	OPCARGS_TypeSizeB,
57 	OPCARGS_VTableIndex_Byte,
58 	OPCARGS_VTableIndexB_Byte,
59 	OPCARGS_FieldOffset_Byte,
60 	OPCARGS_FieldOffsetS_Byte,
61 	OPCARGS_FieldOffsetB_Byte,
62 	OPCARGS_Type,
63 };
64 
65 enum
66 {
67 #define DECLARE_OPC(name, args)		OPC_##name
68 #endif
69 
70 	DECLARE_OPC(Done, None),
71 
72 	//	Call / return
73 	DECLARE_OPC(Call, Member),
74 	DECLARE_OPC(PushVFunc, VTableIndex),
75 	DECLARE_OPC(PushVFuncB, VTableIndexB),
76 	DECLARE_OPC(VCall, VTableIndex_Byte),
77 	DECLARE_OPC(VCallB, VTableIndexB_Byte),
78 	DECLARE_OPC(DelegateCall, FieldOffset_Byte),
79 	DECLARE_OPC(DelegateCallS, FieldOffsetS_Byte),
80 	DECLARE_OPC(DelegateCallB, FieldOffsetB_Byte),
81 	DECLARE_OPC(Return, None),
82 	DECLARE_OPC(ReturnL, None),
83 	DECLARE_OPC(ReturnV, None),
84 
85 	//	Branching
86 	DECLARE_OPC(GotoB, BranchTargetB),
87 	DECLARE_OPC(GotoNB, BranchTargetNB),
88 	DECLARE_OPC(GotoS, BranchTargetS),
89 	DECLARE_OPC(Goto, BranchTarget),
90 	DECLARE_OPC(IfGotoB, BranchTargetB),
91 	DECLARE_OPC(IfGotoNB, BranchTargetNB),
92 	DECLARE_OPC(IfGotoS, BranchTargetS),
93 	DECLARE_OPC(IfGoto, BranchTarget),
94 	DECLARE_OPC(IfNotGotoB, BranchTargetB),
95 	DECLARE_OPC(IfNotGotoNB, BranchTargetNB),
96 	DECLARE_OPC(IfNotGotoS, BranchTargetS),
97 	DECLARE_OPC(IfNotGoto, BranchTarget),
98 	DECLARE_OPC(CaseGotoB, ByteBranchTarget),
99 	DECLARE_OPC(CaseGotoS, ShortBranchTarget),
100 	DECLARE_OPC(CaseGoto, IntBranchTarget),
101 
102 	//	Push constants.
103 	DECLARE_OPC(PushNumber0, None),
104 	DECLARE_OPC(PushNumber1, None),
105 	DECLARE_OPC(PushNumberB, Byte),
106 	DECLARE_OPC(PushNumberS, Short),
107 	DECLARE_OPC(PushNumber, Int),
108 	DECLARE_OPC(PushName, Name),
109 	DECLARE_OPC(PushNameS, NameS),
110 	DECLARE_OPC(PushNameB, NameB),
111 	DECLARE_OPC(PushString, String),
112 	DECLARE_OPC(PushClassId, Member),
113 	DECLARE_OPC(PushState, Member),
114 	DECLARE_OPC(PushNull, None),
115 
116 	//	Loading of variables
117 	DECLARE_OPC(LocalAddress0, None),
118 	DECLARE_OPC(LocalAddress1, None),
119 	DECLARE_OPC(LocalAddress2, None),
120 	DECLARE_OPC(LocalAddress3, None),
121 	DECLARE_OPC(LocalAddress4, None),
122 	DECLARE_OPC(LocalAddress5, None),
123 	DECLARE_OPC(LocalAddress6, None),
124 	DECLARE_OPC(LocalAddress7, None),
125 	DECLARE_OPC(LocalAddressB, Byte),
126 	DECLARE_OPC(LocalAddressS, Short),
127 	DECLARE_OPC(LocalAddress, Int),
128 	DECLARE_OPC(LocalValue0, None),
129 	DECLARE_OPC(LocalValue1, None),
130 	DECLARE_OPC(LocalValue2, None),
131 	DECLARE_OPC(LocalValue3, None),
132 	DECLARE_OPC(LocalValue4, None),
133 	DECLARE_OPC(LocalValue5, None),
134 	DECLARE_OPC(LocalValue6, None),
135 	DECLARE_OPC(LocalValue7, None),
136 	DECLARE_OPC(LocalValueB, Byte),
137 	DECLARE_OPC(VLocalValueB, Byte),
138 	DECLARE_OPC(StrLocalValueB, Byte),
139 	DECLARE_OPC(Offset, FieldOffset),
140 	DECLARE_OPC(OffsetS, FieldOffsetS),
141 	DECLARE_OPC(OffsetB, FieldOffsetB),
142 	DECLARE_OPC(FieldValue, FieldOffset),
143 	DECLARE_OPC(FieldValueS, FieldOffsetS),
144 	DECLARE_OPC(FieldValueB, FieldOffsetB),
145 	DECLARE_OPC(VFieldValue, FieldOffset),
146 	DECLARE_OPC(VFieldValueS, FieldOffsetS),
147 	DECLARE_OPC(VFieldValueB, FieldOffsetB),
148 	DECLARE_OPC(PtrFieldValue, FieldOffset),
149 	DECLARE_OPC(PtrFieldValueS, FieldOffsetS),
150 	DECLARE_OPC(PtrFieldValueB, FieldOffsetB),
151 	DECLARE_OPC(StrFieldValue, FieldOffset),
152 	DECLARE_OPC(StrFieldValueS, FieldOffsetS),
153 	DECLARE_OPC(StrFieldValueB, FieldOffsetB),
154 	DECLARE_OPC(ByteFieldValue, FieldOffset),
155 	DECLARE_OPC(ByteFieldValueS, FieldOffsetS),
156 	DECLARE_OPC(ByteFieldValueB, FieldOffsetB),
157 	DECLARE_OPC(Bool0FieldValue, FieldOffset_Byte),
158 	DECLARE_OPC(Bool0FieldValueS, FieldOffsetS_Byte),
159 	DECLARE_OPC(Bool0FieldValueB, FieldOffsetB_Byte),
160 	DECLARE_OPC(Bool1FieldValue, FieldOffset_Byte),
161 	DECLARE_OPC(Bool1FieldValueS, FieldOffsetS_Byte),
162 	DECLARE_OPC(Bool1FieldValueB, FieldOffsetB_Byte),
163 	DECLARE_OPC(Bool2FieldValue, FieldOffset_Byte),
164 	DECLARE_OPC(Bool2FieldValueS, FieldOffsetS_Byte),
165 	DECLARE_OPC(Bool2FieldValueB, FieldOffsetB_Byte),
166 	DECLARE_OPC(Bool3FieldValue, FieldOffset_Byte),
167 	DECLARE_OPC(Bool3FieldValueS, FieldOffsetS_Byte),
168 	DECLARE_OPC(Bool3FieldValueB, FieldOffsetB_Byte),
169 	DECLARE_OPC(ArrayElement, TypeSize),
170 	DECLARE_OPC(ArrayElementS, TypeSizeS),
171 	DECLARE_OPC(ArrayElementB, TypeSizeB),
172 	DECLARE_OPC(PushPointed, None),
173 	DECLARE_OPC(VPushPointed, None),
174 	DECLARE_OPC(PushPointedPtr, None),
175 	DECLARE_OPC(PushPointedByte, None),
176 	DECLARE_OPC(PushBool0, Byte),
177 	DECLARE_OPC(PushBool1, Byte),
178 	DECLARE_OPC(PushBool2, Byte),
179 	DECLARE_OPC(PushBool3, Byte),
180 	DECLARE_OPC(PushPointedStr, None),
181 	DECLARE_OPC(PushPointedDelegate, None),
182 
183 	//	Integer opeartors
184 	DECLARE_OPC(Add, None),
185 	DECLARE_OPC(Subtract, None),
186 	DECLARE_OPC(Multiply, None),
187 	DECLARE_OPC(Divide, None),
188 	DECLARE_OPC(Modulus, None),
189 	DECLARE_OPC(Equals, None),
190 	DECLARE_OPC(NotEquals, None),
191 	DECLARE_OPC(Less, None),
192 	DECLARE_OPC(Greater, None),
193 	DECLARE_OPC(LessEquals, None),
194 	DECLARE_OPC(GreaterEquals, None),
195 	DECLARE_OPC(NegateLogical, None),
196 	DECLARE_OPC(AndBitwise, None),
197 	DECLARE_OPC(OrBitwise, None),
198 	DECLARE_OPC(XOrBitwise, None),
199 	DECLARE_OPC(LShift, None),
200 	DECLARE_OPC(RShift, None),
201 	DECLARE_OPC(UnaryMinus, None),
202 	DECLARE_OPC(BitInverse, None),
203 
204 	//	Increment / decrement
205 	DECLARE_OPC(PreInc, None),
206 	DECLARE_OPC(PreDec, None),
207 	DECLARE_OPC(PostInc, None),
208 	DECLARE_OPC(PostDec, None),
209 	DECLARE_OPC(IncDrop, None),
210 	DECLARE_OPC(DecDrop, None),
211 
212 	//	Integer assignment operators
213 	DECLARE_OPC(AssignDrop, None),
214 	DECLARE_OPC(AddVarDrop, None),
215 	DECLARE_OPC(SubVarDrop, None),
216 	DECLARE_OPC(MulVarDrop, None),
217 	DECLARE_OPC(DivVarDrop, None),
218 	DECLARE_OPC(ModVarDrop, None),
219 	DECLARE_OPC(AndVarDrop, None),
220 	DECLARE_OPC(OrVarDrop, None),
221 	DECLARE_OPC(XOrVarDrop, None),
222 	DECLARE_OPC(LShiftVarDrop, None),
223 	DECLARE_OPC(RShiftVarDrop, None),
224 
225 	//	Increment / decrement byte
226 	DECLARE_OPC(BytePreInc, None),
227 	DECLARE_OPC(BytePreDec, None),
228 	DECLARE_OPC(BytePostInc, None),
229 	DECLARE_OPC(BytePostDec, None),
230 	DECLARE_OPC(ByteIncDrop, None),
231 	DECLARE_OPC(ByteDecDrop, None),
232 
233 	//	Byte assignment operators
234 	DECLARE_OPC(ByteAssignDrop, None),
235 	DECLARE_OPC(ByteAddVarDrop, None),
236 	DECLARE_OPC(ByteSubVarDrop, None),
237 	DECLARE_OPC(ByteMulVarDrop, None),
238 	DECLARE_OPC(ByteDivVarDrop, None),
239 	DECLARE_OPC(ByteModVarDrop, None),
240 	DECLARE_OPC(ByteAndVarDrop, None),
241 	DECLARE_OPC(ByteOrVarDrop, None),
242 	DECLARE_OPC(ByteXOrVarDrop, None),
243 	DECLARE_OPC(ByteLShiftVarDrop, None),
244 	DECLARE_OPC(ByteRShiftVarDrop, None),
245 
246 	//	Floating point operators
247 	DECLARE_OPC(FAdd, None),
248 	DECLARE_OPC(FSubtract, None),
249 	DECLARE_OPC(FMultiply, None),
250 	DECLARE_OPC(FDivide, None),
251 	DECLARE_OPC(FEquals, None),
252 	DECLARE_OPC(FNotEquals, None),
253 	DECLARE_OPC(FLess, None),
254 	DECLARE_OPC(FGreater, None),
255 	DECLARE_OPC(FLessEquals, None),
256 	DECLARE_OPC(FGreaterEquals, None),
257 	DECLARE_OPC(FUnaryMinus, None),
258 
259 	//	Floating point assignment operators
260 	DECLARE_OPC(FAddVarDrop, None),
261 	DECLARE_OPC(FSubVarDrop, None),
262 	DECLARE_OPC(FMulVarDrop, None),
263 	DECLARE_OPC(FDivVarDrop, None),
264 
265 	//	Vector operators
266 	DECLARE_OPC(VAdd, None),
267 	DECLARE_OPC(VSubtract, None),
268 	DECLARE_OPC(VPreScale, None),
269 	DECLARE_OPC(VPostScale, None),
270 	DECLARE_OPC(VIScale, None),
271 	DECLARE_OPC(VEquals, None),
272 	DECLARE_OPC(VNotEquals, None),
273 	DECLARE_OPC(VUnaryMinus, None),
274 	DECLARE_OPC(VFixParam, Byte),
275 
276 	//	Vector assignment operators
277 	DECLARE_OPC(VAssignDrop, None),
278 	DECLARE_OPC(VAddVarDrop, None),
279 	DECLARE_OPC(VSubVarDrop, None),
280 	DECLARE_OPC(VScaleVarDrop, None),
281 	DECLARE_OPC(VIScaleVarDrop, None),
282 
283 	//	String operators
284 	DECLARE_OPC(StrToBool, None),
285 
286 	//	String assignment operators
287 	DECLARE_OPC(AssignStrDrop, None),
288 
289 	//	Pointer opeartors
290 	DECLARE_OPC(PtrEquals, None),
291 	DECLARE_OPC(PtrNotEquals, None),
292 	DECLARE_OPC(PtrToBool, None),
293 
294 	//	Cleanup of local variables.
295 	DECLARE_OPC(ClearPointedStr, None),
296 	DECLARE_OPC(ClearPointedStruct, Member),
297 
298 	//	Drop result
299 	DECLARE_OPC(Drop, None),
300 	DECLARE_OPC(VDrop, None),
301 	DECLARE_OPC(DropStr, None),
302 
303 	//	Special assignment operators
304 	DECLARE_OPC(AssignPtrDrop, None),
305 	DECLARE_OPC(AssignBool0, Byte),
306 	DECLARE_OPC(AssignBool1, Byte),
307 	DECLARE_OPC(AssignBool2, Byte),
308 	DECLARE_OPC(AssignBool3, Byte),
309 	DECLARE_OPC(AssignDelegate, None),
310 
311 	//	Dynamic arrays
312 	DECLARE_OPC(DynArrayElement, TypeSize),
313 	DECLARE_OPC(DynArrayElementS, TypeSizeS),
314 	DECLARE_OPC(DynArrayElementB, TypeSizeB),
315 	DECLARE_OPC(DynArrayElementGrow, Type),
316 	DECLARE_OPC(DynArrayGetNum, None),
317 	DECLARE_OPC(DynArraySetNum, Type),
318 	DECLARE_OPC(DynArrayInsert, Type),
319 	DECLARE_OPC(DynArrayRemove, Type),
320 
321 	//	Dynamic cast
322 	DECLARE_OPC(DynamicCast, Member),
323 	DECLARE_OPC(DynamicClassCast, Member),
324 
325 	//	Access to the default object
326 	DECLARE_OPC(GetDefaultObj, None),
327 	DECLARE_OPC(GetClassDefaultObj, None),
328 
329 	//	Iterators
330 	DECLARE_OPC(IteratorInit, None),
331 	DECLARE_OPC(IteratorNext, None),
332 	DECLARE_OPC(IteratorPop, None),
333 
334 #undef DECLARE_OPC
335 #ifndef OPCODE_INFO
336 	NUM_OPCODES
337 };
338 
339 struct dprograms_t
340 {
341 	char	magic[4];		//	"VPRG"
342 	int		version;
343 
344 	int		ofs_names;
345 	int		num_names;
346 
347 	int		num_strings;
348 	int		ofs_strings;
349 
350 	int		ofs_mobjinfo;
351 	int		num_mobjinfo;
352 
353 	int		ofs_scriptids;
354 	int		num_scriptids;
355 
356 	int		ofs_exportinfo;
357 	int		ofs_exportdata;
358 	int		num_exports;
359 
360 	int		ofs_imports;
361 	int		num_imports;
362 };
363 
364 //==========================================================================
365 //
366 //	VProgsImport
367 //
368 //==========================================================================
369 
370 struct VProgsImport
371 {
372 	vuint8			Type;
373 	VName			Name;
374 	vint32			OuterIndex;
375 	VName			ParentClassName;	//	For decorate class imports.
376 
377 	VMemberBase*	Obj;
378 
VProgsImportVProgsImport379 	VProgsImport()
380 	: Type(0)
381 	, Name(NAME_None)
382 	, OuterIndex(0)
383 	, Obj(0)
384 	{}
385 	VProgsImport(VMemberBase* InObj, vint32 InOuterIndex);
386 
387 	friend VStream& operator<<(VStream& Strm, VProgsImport& I)
388 	{
389 		Strm << I.Type << I.Name << STRM_INDEX(I.OuterIndex);
390 		if (I.Type == MEMBER_DecorateClass)
391 		{
392 			Strm << I.ParentClassName;
393 		}
394 		return Strm;
395 	}
396 };
397 
398 //==========================================================================
399 //
400 //	VProgsExport
401 //
402 //==========================================================================
403 
404 struct VProgsExport
405 {
406 	vuint8			Type;
407 	VName			Name;
408 
409 	VMemberBase*	Obj;
410 
VProgsExportVProgsExport411 	VProgsExport()
412 	: Type(0)
413 	, Name(NAME_None)
414 	, Obj(0)
415 	{}
416 	VProgsExport(VMemberBase* InObj);
417 
418 	friend VStream& operator<<(VStream& Strm, VProgsExport& E)
419 	{
420 		return Strm << E.Type << E.Name;
421 	}
422 };
423 
424 #endif
425