mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-10 14:51:40 +00:00
fix argument pointer wrapping in function pointers
This commit is contained in:
parent
b1f53e7eb5
commit
071b5c5180
1 changed files with 17 additions and 3 deletions
|
@ -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)*/);
|
||||
|
|
Loading…
Reference in a new issue