- moved Restricted/ForbiddenToPlayerClass fully to the script side.

This required some fixes for allowing to read from metadata arrays.
This commit is contained in:
Christoph Oelckers 2017-04-11 15:11:13 +02:00
parent 45691e91c9
commit 6a3ddaa8fa
7 changed files with 49 additions and 55 deletions

View file

@ -6914,13 +6914,13 @@ FxStructMember::~FxStructMember()
bool FxStructMember::RequestAddress(FCompileContext &ctx, bool *writable)
{
// Cannot take the address of metadata variables.
AddressRequested = true;
if (membervar->Flags & VARF_Meta)
{
return false;
// Meta variables are read only.
*writable = false;
}
AddressRequested = true;
if (writable != nullptr)
else if (writable != nullptr)
{
// [ZZ] original check.
bool bWritable = (AddressWritable && !ctx.CheckWritable(membervar->Flags) &&
@ -7314,11 +7314,13 @@ ExpEmit FxArrayElement::Emit(VMFunctionBuilder *build)
if (SizeAddr != ~0u)
{
bool ismeta = Array->ExprType == EFX_ClassMember && static_cast<FxClassMember*>(Array)->membervar->Flags & VARF_Meta;
arrayvar.Free(build);
start = ExpEmit(build, REGT_POINTER);
build->Emit(OP_LP, start.RegNum, arrayvar.RegNum, build->GetConstantInt(0));
auto f = new PField(NAME_None, TypeUInt32, 0, SizeAddr);
auto f = new PField(NAME_None, TypeUInt32, ismeta? VARF_Meta : 0, SizeAddr);
static_cast<FxMemberBase *>(Array)->membervar = f;
static_cast<FxMemberBase *>(Array)->AddressRequested = false;
Array->ValueType = TypeUInt32;