- reactivated some more code after integrating the VM core.

There's a few bits here and there that only have meaning in Doom but they are kept to allow using the same unaltered source files in both engines.
This commit is contained in:
Christoph Oelckers 2020-04-06 23:32:29 +02:00
parent a6d982ed04
commit bb9a077424
9 changed files with 162 additions and 36 deletions

View file

@ -637,6 +637,16 @@ set( NOT_COMPILED_SOURCE_FILES
platform/win32/zutil.natvis platform/win32/zutil.natvis
) )
set( VM_JIT_SOURCES
common/scripting/jit/jit.cpp
common/scripting/jit/jit_runtime.cpp
common/scripting/jit/jit_call.cpp
common/scripting/jit/jit_flow.cpp
common/scripting/jit/jit_load.cpp
common/scripting/jit/jit_math.cpp
common/scripting/jit/jit_move.cpp
common/scripting/jit/jit_store.cpp
)
# Enable fast math for some sources where performance matters (or where the PCH must not be used.) (This would be good for rendering code, but unfortunately that is hopelessly intermingled with the playsim code in engine.cpp.) # Enable fast math for some sources where performance matters (or where the PCH must not be used.) (This would be good for rendering code, but unfortunately that is hopelessly intermingled with the playsim code in engine.cpp.)
set( FASTMATH_SOURCES set( FASTMATH_SOURCES
@ -785,14 +795,6 @@ set (PCH_SOURCES
common/scripting/core/vmdisasm.cpp common/scripting/core/vmdisasm.cpp
common/scripting/vm/vmexec.cpp common/scripting/vm/vmexec.cpp
common/scripting/vm/vmframe.cpp common/scripting/vm/vmframe.cpp
common/scripting/jit/jit.cpp
common/scripting/jit/jit_call.cpp
common/scripting/jit/jit_flow.cpp
common/scripting/jit/jit_load.cpp
common/scripting/jit/jit_math.cpp
common/scripting/jit/jit_move.cpp
common/scripting/jit/jit_runtime.cpp
common/scripting/jit/jit_store.cpp
common/scripting/interface/stringformat.cpp common/scripting/interface/stringformat.cpp
core/utility/stats.cpp core/utility/stats.cpp
@ -846,6 +848,12 @@ set (PCH_SOURCES
core/rendering/hwrenderer/utility/hw_shaderpatcher.cpp core/rendering/hwrenderer/utility/hw_shaderpatcher.cpp
) )
if( ${HAVE_VM_JIT} )
set( PCH_SOURCES ${PCH_SOURCES} ${VM_JIT_SOURCES} )
else()
set( NOT_COMPILED_SOURCE_FILES ${NOT_COMPILED_SOURCE_FILES} ${VM_JIT_SOURCES} )
endif()
macro( use_precompiled_header ) macro( use_precompiled_header )
if( MSVC ) if( MSVC )
enable_precompiled_headers( "${ARGV0}/g_pch.h" PCH_SOURCES ) enable_precompiled_headers( "${ARGV0}/g_pch.h" PCH_SOURCES )

View file

@ -38,6 +38,8 @@
#include "cmdlib.h" #include "cmdlib.h"
#include "c_dispatch.h" #include "c_dispatch.h"
#include "serializer.h" #include "serializer.h"
#include "vm.h"
#include "types.h"
#include "i_time.h" #include "i_time.h"
#include "printf.h" #include "printf.h"
@ -60,6 +62,9 @@ ClassReg DObject::RegistrationInfo =
}; };
_DECLARE_TI(DObject) _DECLARE_TI(DObject)
// This bit is needed in the playsim - but give it a less crappy name.
DEFINE_FIELD_BIT(DObject,ObjectFlags, bDestroyed, OF_EuthanizeMe)
//========================================================================== //==========================================================================
// //
@ -314,26 +319,22 @@ void DObject:: Destroy ()
// We cannot call the VM during shutdown because all the needed data has been or is in the process of being deleted. // We cannot call the VM during shutdown because all the needed data has been or is in the process of being deleted.
if (PClass::bVMOperational) if (PClass::bVMOperational)
{ {
#if 0
IFVIRTUAL(DObject, OnDestroy) IFVIRTUAL(DObject, OnDestroy)
{ {
VMValue params[1] = { (DObject*)this }; VMValue params[1] = { (DObject*)this };
VMCall(func, params, 1, nullptr, 0); VMCall(func, params, 1, nullptr, 0);
} }
#endif
} }
OnDestroy(); OnDestroy();
ObjectFlags = (ObjectFlags & ~OF_Fixed) | OF_EuthanizeMe; ObjectFlags = (ObjectFlags & ~OF_Fixed) | OF_EuthanizeMe;
} }
#if 0
DEFINE_ACTION_FUNCTION(DObject, Destroy) DEFINE_ACTION_FUNCTION(DObject, Destroy)
{ {
PARAM_SELF_PROLOGUE(DObject); PARAM_SELF_PROLOGUE(DObject);
self->Destroy(); self->Destroy();
return 0; return 0;
} }
#endif
//========================================================================== //==========================================================================
// //
@ -487,7 +488,6 @@ void DObject::CheckIfSerialized () const
} }
#if 0
DEFINE_ACTION_FUNCTION(DObject, MSTime) DEFINE_ACTION_FUNCTION(DObject, MSTime)
{ {
ACTION_RETURN_INT((uint32_t)I_msTime()); ACTION_RETURN_INT((uint32_t)I_msTime());
@ -512,4 +512,3 @@ void *DObject::ScriptVar(FName field, PType *type)
I_Error("Variable %s not found in %s\n", field.GetChars(), cls->TypeName.GetChars()); I_Error("Variable %s not found in %s\n", field.GetChars(), cls->TypeName.GetChars());
return nullptr; return nullptr;
} }
#endif

View file

@ -392,7 +392,7 @@ static inline void GC::WriteBarrier(DObject *pointed)
#include "memarena.h" #include "memarena.h"
extern FMemArena ClassDataAllocator; extern FMemArena ClassDataAllocator;
//#include "symbols.h" #include "symbols.h"
#include "dobjtype.h" #include "dobjtype.h"
inline bool DObject::IsKindOf (const PClass *base) const inline bool DObject::IsKindOf (const PClass *base) const

View file

@ -264,9 +264,21 @@ void MarkArray(DObject **obj, size_t count)
static void MarkRoot() static void MarkRoot()
{ {
//int i;
Gray = NULL; Gray = NULL;
// Mark soft roots.
if (SoftRoots != NULL)
{
DObject **probe = &SoftRoots->ObjNext;
while (*probe != NULL)
{
DObject *soft = *probe;
probe = &soft->ObjNext;
if ((soft->ObjectFlags & (OF_Rooted | OF_EuthanizeMe)) == OF_Rooted)
{
Mark(soft);
}
}
}
// Time to propagate the marks. // Time to propagate the marks.
State = GCS_Propagate; State = GCS_Propagate;
StepCount = 0; StepCount = 0;

View file

@ -208,6 +208,11 @@ public:
return GC::ReadBarrier(pp); return GC::ReadBarrier(pp);
} }
T ForceGet() throw() //for situations where the read barrier needs to be skipped.
{
return pp;
}
operator T() throw() operator T() throw()
{ {
return GC::ReadBarrier(pp); return GC::ReadBarrier(pp);

View file

@ -42,6 +42,7 @@
#include "autosegs.h" #include "autosegs.h"
#include "v_text.h" #include "v_text.h"
#include "c_cvars.h" #include "c_cvars.h"
#include "vm.h"
#include "symbols.h" #include "symbols.h"
#include "types.h" #include "types.h"
@ -71,8 +72,8 @@ bool PClass::bVMOperational;
// that does not work anymore. WP_NOCHANGE needs to point to a vaild object to work as intended. // that does not work anymore. WP_NOCHANGE needs to point to a vaild object to work as intended.
// This Object does not need to be garbage collected, though, but it needs to provide the proper structure so that the // This Object does not need to be garbage collected, though, but it needs to provide the proper structure so that the
// GC can process it. // GC can process it.
AActor *WP_NOCHANGE; DObject *WP_NOCHANGE;
//DEFINE_GLOBAL(WP_NOCHANGE); DEFINE_GLOBAL(WP_NOCHANGE);
// PRIVATE DATA DEFINITIONS ------------------------------------------------ // PRIVATE DATA DEFINITIONS ------------------------------------------------
@ -202,9 +203,7 @@ static int cregcmp (const void *a, const void *b) NO_SANITIZE
void PClass::StaticInit () void PClass::StaticInit ()
{ {
#if 0
Namespaces.GlobalNamespace = Namespaces.NewNamespace(0); Namespaces.GlobalNamespace = Namespaces.NewNamespace(0);
#endif
FAutoSegIterator probe(CRegHead, CRegTail); FAutoSegIterator probe(CRegHead, CRegTail);
@ -227,12 +226,10 @@ void PClass::StaticInit ()
// I'm not sure if this is really necessary to maintain any sort of sync. // I'm not sure if this is really necessary to maintain any sort of sync.
qsort(&AllClasses[0], AllClasses.Size(), sizeof(AllClasses[0]), cregcmp); qsort(&AllClasses[0], AllClasses.Size(), sizeof(AllClasses[0]), cregcmp);
#if 0
// WP_NOCHANGE must point to a valid object, although it does not need to be a weapon. // WP_NOCHANGE must point to a valid object, although it does not need to be a weapon.
// A simple DObject is enough to give the GC the ability to deal with it, if subjected to it. // A simple DObject is enough to give the GC the ability to deal with it, if subjected to it.
WP_NOCHANGE = (AActor*)Create<DObject>(); WP_NOCHANGE = Create<DObject>();
WP_NOCHANGE->Release(); WP_NOCHANGE->Release();
#endif
} }
//========================================================================== //==========================================================================
@ -245,12 +242,10 @@ void PClass::StaticInit ()
void PClass::StaticShutdown () void PClass::StaticShutdown ()
{ {
#if 0
if (WP_NOCHANGE != nullptr) if (WP_NOCHANGE != nullptr)
{ {
delete WP_NOCHANGE; delete WP_NOCHANGE;
} }
#endif
// delete all variables containing pointers to script functions. // delete all variables containing pointers to script functions.
for (auto p : FunctionPtrList) for (auto p : FunctionPtrList)
@ -259,7 +254,7 @@ void PClass::StaticShutdown ()
} }
//ScriptUtil::Clear(); //ScriptUtil::Clear();
FunctionPtrList.Clear(); FunctionPtrList.Clear();
//VMFunction::DeleteAll(); VMFunction::DeleteAll();
// Make a full garbage collection here so that all destroyed but uncollected higher level objects // Make a full garbage collection here so that all destroyed but uncollected higher level objects
// that still exist are properly taken down before the low level data is deleted. // that still exist are properly taken down before the low level data is deleted.
@ -701,7 +696,7 @@ PClass *PClass::FindClassTentative(FName name)
// and returns an index if something matching is found. // and returns an index if something matching is found.
// //
//========================================================================== //==========================================================================
#if 0
int PClass::FindVirtualIndex(FName name, PFunction::Variant *variant, PFunction *parentfunc) int PClass::FindVirtualIndex(FName name, PFunction::Variant *variant, PFunction *parentfunc)
{ {
auto proto = variant->Proto; auto proto = variant->Proto;
@ -760,7 +755,6 @@ int PClass::FindVirtualIndex(FName name, PFunction::Variant *variant, PFunction
} }
return -1; return -1;
} }
#endif
PSymbol *PClass::FindSymbol(FName symname, bool searchparents) const PSymbol *PClass::FindSymbol(FName symname, bool searchparents) const
{ {
@ -951,7 +945,6 @@ void PClass::FindFunction(VMFunction **pptr, FName clsname, FName funcname)
FunctionPtrList.Push(pptr); FunctionPtrList.Push(pptr);
} }
#if 0
unsigned GetVirtualIndex(PClass *cls, const char *funcname) unsigned GetVirtualIndex(PClass *cls, const char *funcname)
{ {
// Look up the virtual function index in the defining class because this may have gotten overloaded in subclasses with something different than a virtual override. // Look up the virtual function index in the defining class because this may have gotten overloaded in subclasses with something different than a virtual override.
@ -960,6 +953,4 @@ unsigned GetVirtualIndex(PClass *cls, const char *funcname)
auto VIndex = sym->Variants[0].Implementation->VirtualIndex; auto VIndex = sym->Variants[0].Implementation->VirtualIndex;
return VIndex; return VIndex;
} }
#endif

View file

@ -42,9 +42,7 @@ public:
void WriteAllFields(FSerializer &ar, const void *addr) const; void WriteAllFields(FSerializer &ar, const void *addr) const;
bool ReadAllFields(FSerializer &ar, void *addr) const; bool ReadAllFields(FSerializer &ar, void *addr) const;
void InitializeDefaults(); void InitializeDefaults();
#if 0
int FindVirtualIndex(FName name, PFunction::Variant *variant, PFunction *parentfunc); int FindVirtualIndex(FName name, PFunction::Variant *variant, PFunction *parentfunc);
#endif
PSymbol *FindSymbol(FName symname, bool searchparents) const; PSymbol *FindSymbol(FName symname, bool searchparents) const;
PField *AddField(FName name, PType *type, uint32_t flags); PField *AddField(FName name, PType *type, uint32_t flags);

View file

@ -35,7 +35,6 @@
#include "vmintern.h" #include "vmintern.h"
#include "s_soundinternal.h" #include "s_soundinternal.h"
//#include "dthinker.h"
#include "types.h" #include "types.h"
#include "printf.h" #include "printf.h"
#include "textureid.h" #include "textureid.h"
@ -56,6 +55,8 @@ PName *TypeName;
PSound *TypeSound; PSound *TypeSound;
PColor *TypeColor; PColor *TypeColor;
PTextureID *TypeTextureID; PTextureID *TypeTextureID;
PSpriteID *TypeSpriteID;
PStatePointer *TypeState;
PPointer *TypeFont; PPointer *TypeFont;
PStateLabel *TypeStateLabel; PStateLabel *TypeStateLabel;
PStruct *TypeVector2; PStruct *TypeVector2;
@ -300,8 +301,10 @@ void PType::StaticInit()
TypeTable.AddType(TypeName = new PName, NAME_Name); TypeTable.AddType(TypeName = new PName, NAME_Name);
TypeTable.AddType(TypeSound = new PSound, NAME_Sound); TypeTable.AddType(TypeSound = new PSound, NAME_Sound);
TypeTable.AddType(TypeColor = new PColor, NAME_Color); TypeTable.AddType(TypeColor = new PColor, NAME_Color);
TypeTable.AddType(TypeState = new PStatePointer, NAME_Pointer);
TypeTable.AddType(TypeStateLabel = new PStateLabel, NAME_Label); TypeTable.AddType(TypeStateLabel = new PStateLabel, NAME_Label);
TypeTable.AddType(TypeNullPtr = new PPointer, NAME_Pointer); TypeTable.AddType(TypeNullPtr = new PPointer, NAME_Pointer);
TypeTable.AddType(TypeSpriteID = new PSpriteID, NAME_SpriteID);
TypeTable.AddType(TypeTextureID = new PTextureID, NAME_TextureID); TypeTable.AddType(TypeTextureID = new PTextureID, NAME_TextureID);
TypeVoidPtr = NewPointer(TypeVoid, false); TypeVoidPtr = NewPointer(TypeVoid, false);
@ -360,6 +363,7 @@ void PType::StaticInit()
Namespaces.GlobalNamespace->Symbols.AddSymbol(Create<PSymbolType>(NAME_Name, TypeName)); Namespaces.GlobalNamespace->Symbols.AddSymbol(Create<PSymbolType>(NAME_Name, TypeName));
Namespaces.GlobalNamespace->Symbols.AddSymbol(Create<PSymbolType>(NAME_Sound, TypeSound)); Namespaces.GlobalNamespace->Symbols.AddSymbol(Create<PSymbolType>(NAME_Sound, TypeSound));
Namespaces.GlobalNamespace->Symbols.AddSymbol(Create<PSymbolType>(NAME_Color, TypeColor)); Namespaces.GlobalNamespace->Symbols.AddSymbol(Create<PSymbolType>(NAME_Color, TypeColor));
Namespaces.GlobalNamespace->Symbols.AddSymbol(Create<PSymbolType>(NAME_State, TypeState));
Namespaces.GlobalNamespace->Symbols.AddSymbol(Create<PSymbolType>(NAME_Vector2, TypeVector2)); Namespaces.GlobalNamespace->Symbols.AddSymbol(Create<PSymbolType>(NAME_Vector2, TypeVector2));
Namespaces.GlobalNamespace->Symbols.AddSymbol(Create<PSymbolType>(NAME_Vector3, TypeVector3)); Namespaces.GlobalNamespace->Symbols.AddSymbol(Create<PSymbolType>(NAME_Vector3, TypeVector3));
} }
@ -1074,6 +1078,51 @@ bool PName::ReadValue(FSerializer &ar, const char *key, void *addr) const
} }
} }
/* PSpriteID ******************************************************************/
//==========================================================================
//
// PName Default Constructor
//
//==========================================================================
PSpriteID::PSpriteID()
: PInt(sizeof(int), true, true)
{
Flags |= TYPE_IntNotInt;
mDescriptiveName = "SpriteID";
}
//==========================================================================
//
// PName :: WriteValue
//
//==========================================================================
void PSpriteID::WriteValue(FSerializer &ar, const char *key, const void *addr) const
{
int32_t val = *(int*)addr;
#ifdef GZDOOM
ar.Sprite(key, val, nullptr);
#endif
}
//==========================================================================
//
// PName :: ReadValue
//
//==========================================================================
bool PSpriteID::ReadValue(FSerializer &ar, const char *key, void *addr) const
{
int32_t val = 0;
#ifdef GZDOOM
ar.Sprite(key, val, nullptr);
#endif
*(int*)addr = val;
return true;
}
/* PTextureID ******************************************************************/ /* PTextureID ******************************************************************/
//========================================================================== //==========================================================================
@ -1314,7 +1363,7 @@ PObjectPointer::PObjectPointer(PClass *cls, bool isconst)
loadOp = OP_LO; loadOp = OP_LO;
Flags |= TYPE_ObjectPointer; Flags |= TYPE_ObjectPointer;
// Non-destroyed thinkers are always guaranteed to be linked into the thinker chain so we don't need the write barrier for them. // Non-destroyed thinkers are always guaranteed to be linked into the thinker chain so we don't need the write barrier for them.
//if (cls && !cls->IsDescendantOf(RUNTIME_CLASS(DThinker))) storeOp = OP_SO; if (cls && !cls->IsDescendantOf(NAME_Thinker)) storeOp = OP_SO;
} }
//========================================================================== //==========================================================================
@ -1391,6 +1440,49 @@ PPointer *NewPointer(PClass *cls, bool isconst)
return static_cast<PPointer *>(ptype); return static_cast<PPointer *>(ptype);
} }
/* PStatePointer **********************************************************/
//==========================================================================
//
// PStatePointer Default Constructor
//
//==========================================================================
PStatePointer::PStatePointer()
{
mDescriptiveName = "Pointer<State>";
PointedType = NewStruct(NAME_State, nullptr, true);
IsConst = true;
}
//==========================================================================
//
// PStatePointer :: WriteValue
//
//==========================================================================
void PStatePointer::WriteValue(FSerializer &ar, const char *key, const void *addr) const
{
#ifdef GZDOOM
ar(key, *(FState **)addr);
#endif
}
//==========================================================================
//
// PStatePointer :: ReadValue
//
//==========================================================================
bool PStatePointer::ReadValue(FSerializer &ar, const char *key, void *addr) const
{
bool res = false;
#ifdef GZDOOM
::Serialize(ar, key, *(FState **)addr, nullptr, &res);
#endif
return res;
}
/* PClassPointer **********************************************************/ /* PClassPointer **********************************************************/

View file

@ -356,6 +356,15 @@ public:
bool ReadValue(FSerializer &ar, const char *key,void *addr) const override; bool ReadValue(FSerializer &ar, const char *key,void *addr) const override;
}; };
class PSpriteID : public PInt
{
public:
PSpriteID();
void WriteValue(FSerializer &ar, const char *key, const void *addr) const override;
bool ReadValue(FSerializer &ar, const char *key, void *addr) const override;
};
class PTextureID : public PInt class PTextureID : public PInt
{ {
public: public:
@ -411,6 +420,16 @@ protected:
void SetOps(); void SetOps();
}; };
class PStatePointer : public PPointer
{
public:
PStatePointer();
void WriteValue(FSerializer &ar, const char *key, const void *addr) const override;
bool ReadValue(FSerializer &ar, const char *key, void *addr) const override;
};
class PObjectPointer : public PPointer class PObjectPointer : public PPointer
{ {
public: public:
@ -590,10 +609,12 @@ extern PName *TypeName;
extern PSound *TypeSound; extern PSound *TypeSound;
extern PColor *TypeColor; extern PColor *TypeColor;
extern PTextureID *TypeTextureID; extern PTextureID *TypeTextureID;
extern PSpriteID *TypeSpriteID;
extern PStruct *TypeVector2; extern PStruct *TypeVector2;
extern PStruct *TypeVector3; extern PStruct *TypeVector3;
extern PStruct *TypeColorStruct; extern PStruct *TypeColorStruct;
extern PStruct *TypeStringStruct; extern PStruct *TypeStringStruct;
extern PStatePointer *TypeState;
extern PPointer *TypeFont; extern PPointer *TypeFont;
extern PStateLabel *TypeStateLabel; extern PStateLabel *TypeStateLabel;
extern PPointer *TypeNullPtr; extern PPointer *TypeNullPtr;