- Added a new intrinsic for class pointers to check if the class is abstract (#1308)

This commit is contained in:
Player701 2021-02-18 13:17:23 +03:00 committed by GitHub
commit 387abf81a0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 69 additions and 0 deletions

View file

@ -8256,6 +8256,14 @@ FxExpression *FxMemberFunctionCall::Resolve(FCompileContext& ctx)
return x->Resolve(ctx);
}
}
if (MethodName == NAME_IsAbstract && Self->ValueType->isClassPointer())
{
if (CheckArgSize(NAME_IsAbstract, ArgList, 0, 0, ScriptPosition))
{
auto x = new FxIsAbstract(Self);
return x->Resolve(ctx);
}
}
if (Self->ValueType->isRealPointer())
{
@ -9252,6 +9260,47 @@ ExpEmit FxGetClassName::Emit(VMFunctionBuilder *build)
//
//==========================================================================
FxIsAbstract::FxIsAbstract(FxExpression *self)
:FxExpression(EFX_IsAbstract, self->ScriptPosition)
{
Self = self;
}
FxIsAbstract::~FxIsAbstract()
{
SAFE_DELETE(Self);
}
FxExpression *FxIsAbstract::Resolve(FCompileContext &ctx)
{
SAFE_RESOLVE(Self, ctx);
if (!Self->ValueType->isClassPointer())
{
ScriptPosition.Message(MSG_ERROR, "IsAbstract() requires a class pointer");
delete this;
return nullptr;
}
ValueType = TypeBool;
return this;
}
ExpEmit FxIsAbstract::Emit(VMFunctionBuilder *build)
{
ExpEmit op = Self->Emit(build);
op.Free(build);
ExpEmit to(build, REGT_INT);
build->Emit(OP_LBU, to.RegNum, op.RegNum, build->GetConstantInt(myoffsetof(PClass, bAbstract)));
return to;
}
//==========================================================================
//
//
//==========================================================================
FxColorLiteral::FxColorLiteral(FArgumentList &args, FScriptPosition &sc)
:FxExpression(EFX_ColorLiteral, sc)
{