- Added a new intrinsic for class pointers to check if the class is abstract (#1308)
This commit is contained in:
parent
cdb24b214a
commit
387abf81a0
3 changed files with 69 additions and 0 deletions
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue