Merge http://github.com/ZDoom/gzdoom into gz2
This commit is contained in:
commit
b31c62568b
56 changed files with 691 additions and 450 deletions
|
|
@ -9542,6 +9542,8 @@ FxExpression *FxVMFunctionCall::Resolve(FCompileContext& ctx)
|
|||
auto &argflags = Function->Variants[0].ArgFlags;
|
||||
auto *defaults = FnPtrCall ? nullptr : &Function->Variants[0].Implementation->DefaultArgs;
|
||||
|
||||
if(FnPtrCall) static_cast<VMScriptFunction*>(ctx.Function->Variants[0].Implementation)->blockJit = true;
|
||||
|
||||
int implicit = Function->GetImplicitArgs();
|
||||
|
||||
if (!CheckAccessibility(ctx.Version))
|
||||
|
|
|
|||
|
|
@ -196,15 +196,15 @@ void PType::SetDefaultValue(void *base, unsigned offset, TArray<FTypeAndOffset>
|
|||
//
|
||||
//==========================================================================
|
||||
|
||||
void PType::SetPointer(void *base, unsigned offset, TArray<size_t> *stroffs)
|
||||
void PType::SetPointer(void *base, unsigned offset, TArray<std::pair<size_t, PObjectPointer *>> *stroffs)
|
||||
{
|
||||
}
|
||||
|
||||
void PType::SetPointerArray(void *base, unsigned offset, TArray<size_t> *stroffs)
|
||||
void PType::SetPointerArray(void *base, unsigned offset, TArray<std::pair<size_t, PDynArray *>> *stroffs)
|
||||
{
|
||||
}
|
||||
|
||||
void PType::SetPointerMap(void *base, unsigned offset, TArray<std::pair<size_t,PType *>> *ptrofs)
|
||||
void PType::SetPointerMap(void *base, unsigned offset, TArray<std::pair<size_t, PMap *>> *ptrofs)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -1575,10 +1575,10 @@ PObjectPointer::PObjectPointer(PClass *cls, bool isconst)
|
|||
//
|
||||
//==========================================================================
|
||||
|
||||
void PObjectPointer::SetPointer(void *base, unsigned offset, TArray<size_t> *special)
|
||||
void PObjectPointer::SetPointer(void *base, unsigned offset, TArray<std::pair<size_t, PObjectPointer *>> *special)
|
||||
{
|
||||
// Add to the list of pointers for this class.
|
||||
special->Push(offset);
|
||||
special->Push({offset, this});
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
|
|
@ -1706,7 +1706,7 @@ bool PClassPointer::isCompatible(PType *type)
|
|||
//
|
||||
//==========================================================================
|
||||
|
||||
void PClassPointer::SetPointer(void *base, unsigned offset, TArray<size_t> *special)
|
||||
void PClassPointer::SetPointer(void *base, unsigned offset, TArray<std::pair<size_t, PObjectPointer *>> *special)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -1908,7 +1908,7 @@ void PArray::SetDefaultValue(void *base, unsigned offset, TArray<FTypeAndOffset>
|
|||
//
|
||||
//==========================================================================
|
||||
|
||||
void PArray::SetPointer(void *base, unsigned offset, TArray<size_t> *special)
|
||||
void PArray::SetPointer(void *base, unsigned offset, TArray<std::pair<size_t, PObjectPointer *>> *special)
|
||||
{
|
||||
for (unsigned i = 0; i < ElementCount; ++i)
|
||||
{
|
||||
|
|
@ -1922,7 +1922,7 @@ void PArray::SetPointer(void *base, unsigned offset, TArray<size_t> *special)
|
|||
//
|
||||
//==========================================================================
|
||||
|
||||
void PArray::SetPointerArray(void *base, unsigned offset, TArray<size_t> *special)
|
||||
void PArray::SetPointerArray(void *base, unsigned offset, TArray<std::pair<size_t, PDynArray *>> *special)
|
||||
{
|
||||
if (ElementType->isStruct() || ElementType->isDynArray())
|
||||
{
|
||||
|
|
@ -1939,7 +1939,7 @@ void PArray::SetPointerArray(void *base, unsigned offset, TArray<size_t> *specia
|
|||
//
|
||||
//==========================================================================
|
||||
|
||||
void PArray::SetPointerMap(void *base, unsigned offset, TArray<std::pair<size_t,PType *>> *special)
|
||||
void PArray::SetPointerMap(void *base, unsigned offset, TArray<std::pair<size_t, PMap *>> *special)
|
||||
{
|
||||
if(ElementType->isStruct() || ElementType->isMap())
|
||||
{
|
||||
|
|
@ -2254,12 +2254,12 @@ void PDynArray::SetDefaultValue(void *base, unsigned offset, TArray<FTypeAndOffs
|
|||
//
|
||||
//==========================================================================
|
||||
|
||||
void PDynArray::SetPointerArray(void *base, unsigned offset, TArray<size_t> *special)
|
||||
void PDynArray::SetPointerArray(void *base, unsigned offset, TArray<std::pair<size_t, PDynArray *>> *special)
|
||||
{
|
||||
if (ElementType->isObjectPointer())
|
||||
{
|
||||
// Add to the list of pointer arrays for this class.
|
||||
special->Push(offset);
|
||||
special->Push({offset, this});
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2524,12 +2524,12 @@ void PMap::SetDefaultValue(void *base, unsigned offset, TArray<FTypeAndOffset> *
|
|||
//
|
||||
//==========================================================================
|
||||
|
||||
void PMap::SetPointerMap(void *base, unsigned offset, TArray<std::pair<size_t,PType *>> *special)
|
||||
void PMap::SetPointerMap(void *base, unsigned offset, TArray<std::pair<size_t, PMap *>> *special)
|
||||
{
|
||||
if (ValueType->isObjectPointer())
|
||||
{
|
||||
// Add to the list of pointer arrays for this class.
|
||||
special->Push(std::make_pair(offset,KeyType));
|
||||
special->Push(std::make_pair(offset, this));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -3264,7 +3264,7 @@ void PStruct::SetDefaultValue(void *base, unsigned offset, TArray<FTypeAndOffset
|
|||
//
|
||||
//==========================================================================
|
||||
|
||||
void PStruct::SetPointer(void *base, unsigned offset, TArray<size_t> *special)
|
||||
void PStruct::SetPointer(void *base, unsigned offset, TArray<std::pair<size_t, PObjectPointer *>> *special)
|
||||
{
|
||||
auto it = Symbols.GetIterator();
|
||||
PSymbolTable::MapType::Pair *pair;
|
||||
|
|
@ -3284,7 +3284,7 @@ void PStruct::SetPointer(void *base, unsigned offset, TArray<size_t> *special)
|
|||
//
|
||||
//==========================================================================
|
||||
|
||||
void PStruct::SetPointerArray(void *base, unsigned offset, TArray<size_t> *special)
|
||||
void PStruct::SetPointerArray(void *base, unsigned offset, TArray<std::pair<size_t, PDynArray *>> *special)
|
||||
{
|
||||
auto it = Symbols.GetIterator();
|
||||
PSymbolTable::MapType::Pair *pair;
|
||||
|
|
@ -3304,7 +3304,7 @@ void PStruct::SetPointerArray(void *base, unsigned offset, TArray<size_t> *speci
|
|||
//
|
||||
//==========================================================================
|
||||
|
||||
void PStruct::SetPointerMap(void *base, unsigned offset, TArray<std::pair<size_t,PType *>> *special)
|
||||
void PStruct::SetPointerMap(void *base, unsigned offset, TArray<std::pair<size_t, PMap *>> *special)
|
||||
{
|
||||
auto it = Symbols.GetIterator();
|
||||
PSymbolTable::MapType::Pair *pair;
|
||||
|
|
|
|||
|
|
@ -68,8 +68,11 @@ class PPointer;
|
|||
class PClassPointer;
|
||||
class PFunctionPointer;
|
||||
class PArray;
|
||||
class PDynArray;
|
||||
class PMap;
|
||||
class PStruct;
|
||||
class PClassType;
|
||||
class PObjectPointer;
|
||||
|
||||
struct ZCC_ExprConstant;
|
||||
class PType : public PTypeBase
|
||||
|
|
@ -129,9 +132,9 @@ public:
|
|||
// initialization when the object is created and destruction when the
|
||||
// object is destroyed.
|
||||
virtual void SetDefaultValue(void *base, unsigned offset, TArray<FTypeAndOffset> *special=NULL);
|
||||
virtual void SetPointer(void *base, unsigned offset, TArray<size_t> *ptrofs = NULL);
|
||||
virtual void SetPointerArray(void *base, unsigned offset, TArray<size_t> *ptrofs = NULL);
|
||||
virtual void SetPointerMap(void *base, unsigned offset, TArray<std::pair<size_t,PType *>> *ptrofs = NULL);
|
||||
virtual void SetPointer(void *base, unsigned offset, TArray<std::pair<size_t, PObjectPointer *>> *ptrofs = NULL);
|
||||
virtual void SetPointerArray(void *base, unsigned offset, TArray<std::pair<size_t, PDynArray *>> *ptrofs = NULL);
|
||||
virtual void SetPointerMap(void *base, unsigned offset, TArray<std::pair<size_t, PMap *>> *ptrofs = NULL);
|
||||
|
||||
// Initialize the value, if needed (e.g. strings)
|
||||
virtual void InitializeValue(void *addr, const void *def) const;
|
||||
|
|
@ -455,7 +458,7 @@ public:
|
|||
|
||||
void WriteValue(FSerializer &ar, const char *key, const void *addr) const override;
|
||||
bool ReadValue(FSerializer &ar, const char *key, void *addr) const override;
|
||||
void SetPointer(void *base, unsigned offset, TArray<size_t> *special = NULL) override;
|
||||
void SetPointer(void *base, unsigned offset, TArray<std::pair<size_t, PObjectPointer *>> *special = NULL) override;
|
||||
PClass *PointedClass() const;
|
||||
};
|
||||
|
||||
|
|
@ -471,7 +474,7 @@ public:
|
|||
void WriteValue(FSerializer &ar, const char *key, const void *addr) const override;
|
||||
bool ReadValue(FSerializer &ar, const char *key, void *addr) const override;
|
||||
|
||||
void SetPointer(void *base, unsigned offset, TArray<size_t> *special = NULL) override;
|
||||
void SetPointer(void *base, unsigned offset, TArray<std::pair<size_t, PObjectPointer *>> *special = NULL) override;
|
||||
bool IsMatch(intptr_t id1, intptr_t id2) const override;
|
||||
void GetTypeIDs(intptr_t &id1, intptr_t &id2) const override;
|
||||
};
|
||||
|
|
@ -503,9 +506,9 @@ public:
|
|||
bool ReadValue(FSerializer &ar, const char *key,void *addr) const override;
|
||||
|
||||
void SetDefaultValue(void *base, unsigned offset, TArray<FTypeAndOffset> *special) override;
|
||||
void SetPointer(void *base, unsigned offset, TArray<size_t> *special) override;
|
||||
void SetPointerArray(void *base, unsigned offset, TArray<size_t> *ptrofs = NULL) override;
|
||||
void SetPointerMap(void *base, unsigned offset, TArray<std::pair<size_t,PType *>> *ptrofs = NULL) override;
|
||||
void SetPointer(void *base, unsigned offset, TArray<std::pair<size_t, PObjectPointer *>> *special) override;
|
||||
void SetPointerArray(void *base, unsigned offset, TArray<std::pair<size_t, PDynArray *>> *ptrofs = NULL) override;
|
||||
void SetPointerMap(void *base, unsigned offset, TArray<std::pair<size_t, PMap *>> *ptrofs = NULL) override;
|
||||
};
|
||||
|
||||
class PStaticArray : public PArray
|
||||
|
|
@ -535,7 +538,7 @@ public:
|
|||
void SetDefaultValue(void *base, unsigned offset, TArray<FTypeAndOffset> *specials) override;
|
||||
void InitializeValue(void *addr, const void *def) const override;
|
||||
void DestroyValue(void *addr) const override;
|
||||
void SetPointerArray(void *base, unsigned offset, TArray<size_t> *ptrofs = NULL) override;
|
||||
void SetPointerArray(void *base, unsigned offset, TArray<std::pair<size_t, PDynArray *>> *ptrofs = NULL) override;
|
||||
};
|
||||
|
||||
class PMap : public PCompoundType
|
||||
|
|
@ -579,7 +582,7 @@ public:
|
|||
void SetDefaultValue(void *base, unsigned offset, TArray<FTypeAndOffset> *specials) override;
|
||||
void InitializeValue(void *addr, const void *def) const override;
|
||||
void DestroyValue(void *addr) const override;
|
||||
void SetPointerMap(void *base, unsigned offset, TArray<std::pair<size_t,PType *>> *ptrofs) override;
|
||||
void SetPointerMap(void *base, unsigned offset, TArray<std::pair<size_t, PMap *>> *ptrofs) override;
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -653,9 +656,9 @@ public:
|
|||
void WriteValue(FSerializer &ar, const char *key,const void *addr) const override;
|
||||
bool ReadValue(FSerializer &ar, const char *key,void *addr) const override;
|
||||
void SetDefaultValue(void *base, unsigned offset, TArray<FTypeAndOffset> *specials) override;
|
||||
void SetPointer(void *base, unsigned offset, TArray<size_t> *specials) override;
|
||||
void SetPointerArray(void *base, unsigned offset, TArray<size_t> *special) override;
|
||||
void SetPointerMap(void *base, unsigned offset, TArray<std::pair<size_t,PType *>> *ptrofs) override;
|
||||
void SetPointer(void *base, unsigned offset, TArray<std::pair<size_t, PObjectPointer *>> *specials) override;
|
||||
void SetPointerArray(void *base, unsigned offset, TArray<std::pair<size_t, PDynArray *>> *special) override;
|
||||
void SetPointerMap(void *base, unsigned offset, TArray<std::pair<size_t, PMap *>> *ptrofs) override;
|
||||
};
|
||||
|
||||
class PPrototype : public PCompoundType
|
||||
|
|
|
|||
|
|
@ -43,6 +43,11 @@
|
|||
FSharedStringArena VMStringConstants;
|
||||
|
||||
|
||||
static bool ShouldWrapPointer(PType * type)
|
||||
{
|
||||
return ((type->isStruct() && type != TypeVector2 && type != TypeVector3 && type != TypeVector4 && type != TypeQuaternion && type != TypeFVector2 && type != TypeFVector3 && type != TypeFVector4 && type != TypeFQuaternion) || type->isDynArray() || type->isMap() || type->isMapIterator());
|
||||
}
|
||||
|
||||
int GetIntConst(FxExpression *ex, FCompileContext &ctx)
|
||||
{
|
||||
ex = new FxIntCast(ex, false);
|
||||
|
|
@ -2049,8 +2054,17 @@ PType *ZCCCompiler::DetermineType(PType *outertype, ZCC_TreeNode *field, FName n
|
|||
} while( (t = (ZCC_Type *)t->SiblingNext) != fn->RetType);
|
||||
|
||||
if(auto *t = fn->Params; t != nullptr) do {
|
||||
args.Push(DetermineType(outertype, field, name, t->Type, false, false));
|
||||
argflags.Push(t->Flags == ZCC_Out ? VARF_Out : 0);
|
||||
PType * tt = DetermineType(outertype, field, name, t->Type, false, false);
|
||||
int flags = 0;
|
||||
|
||||
if (ShouldWrapPointer(tt))
|
||||
{
|
||||
tt = NewPointer(tt);
|
||||
flags = VARF_Ref;
|
||||
}
|
||||
|
||||
args.Push(tt);
|
||||
argflags.Push(t->Flags == ZCC_Out ? VARF_Out|flags : flags);
|
||||
} while( (t = (ZCC_FuncPtrParamDecl *) t->SiblingNext) != fn->Params);
|
||||
|
||||
auto proto = NewPrototype(returns,args);
|
||||
|
|
@ -2550,7 +2564,7 @@ void ZCCCompiler::CompileFunction(ZCC_StructWork *c, ZCC_FuncDeclarator *f, bool
|
|||
{
|
||||
auto type = DetermineType(c->Type(), p, f->Name, p->Type, false, false);
|
||||
int flags = 0;
|
||||
if ((type->isStruct() && type != TypeVector2 && type != TypeVector3 && type != TypeVector4 && type != TypeQuaternion && type != TypeFVector2 && type != TypeFVector3 && type != TypeFVector4 && type != TypeFQuaternion) || type->isDynArray() || type->isMap() || type->isMapIterator())
|
||||
if (ShouldWrapPointer(type))
|
||||
{
|
||||
// Structs are being passed by pointer, but unless marked 'out' that pointer must be readonly.
|
||||
type = NewPointer(type /*, !(p->Flags & ZCC_Out)*/);
|
||||
|
|
|
|||
|
|
@ -279,6 +279,8 @@ static bool CanJit(VMScriptFunction *func)
|
|||
// Asmjit has a 256 register limit. Stay safely away from it as the jit compiler uses a few for temporaries as well.
|
||||
// Any function exceeding the limit will use the VM - a fair punishment to someone for writing a function so bloated ;)
|
||||
|
||||
if(func->blockJit) return false;
|
||||
|
||||
int maxregs = 200;
|
||||
if (func->NumRegA + func->NumRegD + func->NumRegF + func->NumRegS < maxregs)
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -474,6 +474,8 @@ public:
|
|||
VM_UBYTE NumArgs; // Number of arguments this function takes
|
||||
TArray<FTypeAndOffset> SpecialInits; // list of all contents on the extra stack which require construction and destruction
|
||||
|
||||
bool blockJit = false; // function triggers Jit bugs, block compilation until bugs are fixed
|
||||
|
||||
void InitExtra(void *addr);
|
||||
void DestroyExtra(void *addr);
|
||||
int AllocExtraStack(PType *type);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue