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