Add static member variables
This commit is contained in:
parent
07dc6dc4db
commit
4732f76bd5
|
@ -309,30 +309,48 @@ Declaration* Parser::ParseStructDeclaration(uint64 flags, DecType dt, Declaratio
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
mdec->mType = DT_ELEMENT;
|
if (mdec->mFlags & DTF_STATIC)
|
||||||
mdec->mOffset = offset;
|
|
||||||
|
|
||||||
offset += mdec->mBase->mSize;
|
|
||||||
if (offset > dec->mSize)
|
|
||||||
dec->mSize = offset;
|
|
||||||
|
|
||||||
if (dec->mScope->Insert(mdec->mIdent, mdec))
|
|
||||||
mErrors->Error(mdec->mLocation, EERR_DUPLICATE_DEFINITION, "Duplicate struct member declaration", mdec->mIdent);
|
|
||||||
|
|
||||||
if (dec->mConst)
|
|
||||||
{
|
{
|
||||||
Declaration* cmdec = mdec->Clone();
|
mdec->mFlags |= DTF_GLOBAL;
|
||||||
cmdec->mBase = mdec->mBase->ToConstType();
|
mdec->mVarIndex = -1;
|
||||||
|
mdec->mQualIdent = mScope->Mangle(mdec->mIdent);
|
||||||
|
|
||||||
dec->mConst->mScope->Insert(cmdec->mIdent, cmdec);
|
Declaration * pdec = mCompilationUnits->mScope->Insert(mdec->mQualIdent, mdec);
|
||||||
dec->mConst->mSize = dec->mSize;
|
|
||||||
|
if (pdec)
|
||||||
|
mdec = pdec;
|
||||||
|
|
||||||
|
if (dec->mScope->Insert(mdec->mIdent, mdec))
|
||||||
|
mErrors->Error(mdec->mLocation, EERR_DUPLICATE_DEFINITION, "Duplicate struct member declaration", mdec->mIdent);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mdec->mType = DT_ELEMENT;
|
||||||
|
mdec->mOffset = offset;
|
||||||
|
|
||||||
|
offset += mdec->mBase->mSize;
|
||||||
|
if (offset > dec->mSize)
|
||||||
|
dec->mSize = offset;
|
||||||
|
|
||||||
|
if (dec->mScope->Insert(mdec->mIdent, mdec))
|
||||||
|
mErrors->Error(mdec->mLocation, EERR_DUPLICATE_DEFINITION, "Duplicate struct member declaration", mdec->mIdent);
|
||||||
|
|
||||||
|
if (dec->mConst)
|
||||||
|
{
|
||||||
|
Declaration* cmdec = mdec->Clone();
|
||||||
|
cmdec->mBase = mdec->mBase->ToConstType();
|
||||||
|
|
||||||
|
dec->mConst->mScope->Insert(cmdec->mIdent, cmdec);
|
||||||
|
dec->mConst->mSize = dec->mSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mlast)
|
||||||
|
mlast->mNext = mdec;
|
||||||
|
else
|
||||||
|
dec->mParams = mdec;
|
||||||
|
mlast = mdec;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mlast)
|
|
||||||
mlast->mNext = mdec;
|
|
||||||
else
|
|
||||||
dec->mParams = mdec;
|
|
||||||
mlast = mdec;
|
|
||||||
mdec = mdec->mNext;
|
mdec = mdec->mNext;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3986,6 +4004,10 @@ Declaration* Parser::ParseDeclaration(Declaration * pdec, bool variable, bool ex
|
||||||
else
|
else
|
||||||
ndec->mVarIndex = mLocalIndex++;
|
ndec->mVarIndex = mLocalIndex++;
|
||||||
}
|
}
|
||||||
|
else if (pthis)
|
||||||
|
{
|
||||||
|
ndec->mFlags |= storageFlags & DTF_STATIC;
|
||||||
|
}
|
||||||
|
|
||||||
ndec->mOffset = 0;
|
ndec->mOffset = 0;
|
||||||
|
|
||||||
|
@ -4863,6 +4885,13 @@ Expression* Parser::ParseQualify(Expression* exp)
|
||||||
|
|
||||||
exp = nexp->ConstantFold(mErrors);
|
exp = nexp->ConstantFold(mErrors);
|
||||||
}
|
}
|
||||||
|
else if (mdec->mType == DT_VARIABLE)
|
||||||
|
{
|
||||||
|
nexp = new Expression(mScanner->mLocation, EX_VARIABLE);
|
||||||
|
nexp->mDecValue = mdec;
|
||||||
|
nexp->mDecType = mdec->mBase;
|
||||||
|
exp = nexp->ConstantFold(mErrors);
|
||||||
|
}
|
||||||
else if (mdec->mType == DT_CONST_FUNCTION)
|
else if (mdec->mType == DT_CONST_FUNCTION)
|
||||||
{
|
{
|
||||||
ConsumeToken(TK_OPEN_PARENTHESIS);
|
ConsumeToken(TK_OPEN_PARENTHESIS);
|
||||||
|
|
Loading…
Reference in New Issue