Lines 27-32
Link Here
|
27 |
#include "progdefs.h" |
27 |
#include "progdefs.h" |
28 |
#include "network.h" |
28 |
#include "network.h" |
29 |
|
29 |
|
|
|
30 |
class DummyClass1 : public VVirtualObjectBase |
31 |
{ |
32 |
public: |
33 |
void* Pointer; |
34 |
vuint8 Byte1; |
35 |
virtual void Dummy() = 0; |
36 |
}; |
37 |
|
38 |
class DummyClass2 : public DummyClass1 |
39 |
{ |
40 |
public: |
41 |
vuint8 Byte2; |
42 |
}; |
43 |
|
30 |
bool VMemberBase::GObjInitialised; |
44 |
bool VMemberBase::GObjInitialised; |
31 |
VClass* VMemberBase::GClasses; |
45 |
VClass* VMemberBase::GClasses; |
32 |
TArray<VMemberBase*> VMemberBase::GMembers; |
46 |
TArray<VMemberBase*> VMemberBase::GMembers; |
Lines 2353-2358
Link Here
|
2353 |
, LinkNext(0) |
2367 |
, LinkNext(0) |
2354 |
, ParentClass(0) |
2368 |
, ParentClass(0) |
2355 |
, ClassSize(0) |
2369 |
, ClassSize(0) |
|
|
2370 |
, ClassUnalignedSize(0) |
2356 |
, ClassFlags(0) |
2371 |
, ClassFlags(0) |
2357 |
, ClassVTable(0) |
2372 |
, ClassVTable(0) |
2358 |
, ClassConstructor(0) |
2373 |
, ClassConstructor(0) |
Lines 2388-2393
Link Here
|
2388 |
, LinkNext(0) |
2403 |
, LinkNext(0) |
2389 |
, ParentClass(AParent) |
2404 |
, ParentClass(AParent) |
2390 |
, ClassSize(ASize) |
2405 |
, ClassSize(ASize) |
|
|
2406 |
, ClassUnalignedSize(ASize) |
2391 |
, ClassFlags(AClassFlags) |
2407 |
, ClassFlags(AClassFlags) |
2392 |
, ClassVTable(0) |
2408 |
, ClassVTable(0) |
2393 |
, ClassConstructor(ACtor) |
2409 |
, ClassConstructor(ACtor) |
Lines 2477-2482
Link Here
|
2477 |
delete[] Defaults; |
2493 |
delete[] Defaults; |
2478 |
Defaults = NULL; |
2494 |
Defaults = NULL; |
2479 |
} |
2495 |
} |
|
|
2496 |
StatesLookup.Clear(); |
2497 |
RepInfos.Clear(); |
2480 |
unguard; |
2498 |
unguard; |
2481 |
} |
2499 |
} |
2482 |
|
2500 |
|
Lines 2849-2858
Link Here
|
2849 |
return; |
2867 |
return; |
2850 |
} |
2868 |
} |
2851 |
|
2869 |
|
2852 |
int PrevSize = ClassSize; |
|
|
2853 |
int size = ParentClass ? ParentClass->ClassSize : 0; |
2854 |
int numMethods = ParentClass ? ParentClass->ClassNumMethods : 0; |
2870 |
int numMethods = ParentClass ? ParentClass->ClassNumMethods : 0; |
2855 |
VField* PrevField = NULL; |
|
|
2856 |
for (int i = 0; i < GMembers.Num(); i++) |
2871 |
for (int i = 0; i < GMembers.Num(); i++) |
2857 |
{ |
2872 |
{ |
2858 |
if (GMembers[i]->MemberType != MEMBER_Method || |
2873 |
if (GMembers[i]->MemberType != MEMBER_Method || |
Lines 2877-2882
Link Here
|
2877 |
} |
2892 |
} |
2878 |
M->VTableIndex = MOfs; |
2893 |
M->VTableIndex = MOfs; |
2879 |
} |
2894 |
} |
|
|
2895 |
|
2896 |
VField* PrevField = NULL; |
2897 |
int PrevSize = ClassSize; |
2898 |
int size = 0; |
2899 |
if (ParentClass) |
2900 |
{ |
2901 |
// GCC has a strange behavior of starting to add fields in subclasses |
2902 |
// in a class that has virtual methods on unaligned parent size offset. |
2903 |
// In other cases and in other compilers it starts on aligned parent |
2904 |
// class size offset. |
2905 |
if (sizeof(DummyClass1) == sizeof(DummyClass2)) |
2906 |
size = ParentClass->ClassUnalignedSize; |
2907 |
else |
2908 |
size = ParentClass->ClassSize; |
2909 |
} |
2880 |
for (VField* fi = Fields; fi; fi = fi->Next) |
2910 |
for (VField* fi = Fields; fi; fi = fi->Next) |
2881 |
{ |
2911 |
{ |
2882 |
if (fi->Type.Type == ev_bool && PrevField && |
2912 |
if (fi->Type.Type == ev_bool && PrevField && |
Lines 2904-2909
Link Here
|
2904 |
} |
2934 |
} |
2905 |
PrevField = fi; |
2935 |
PrevField = fi; |
2906 |
} |
2936 |
} |
|
|
2937 |
ClassUnalignedSize = size; |
2907 |
size = (size + sizeof(void*) - 1) & ~(sizeof(void*) - 1); |
2938 |
size = (size + sizeof(void*) - 1) & ~(sizeof(void*) - 1); |
2908 |
ClassSize = size; |
2939 |
ClassSize = size; |
2909 |
ClassNumMethods = numMethods; |
2940 |
ClassNumMethods = numMethods; |