mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-09 03:52:19 +02:00
Fixed const string bitcast failure
This commit is contained in:
parent
03987ba8f5
commit
3864a8896b
3 changed files with 32 additions and 2 deletions
|
@ -184,7 +184,13 @@ BfTypedValue BfConstResolver::Resolve(BfExpression* expr, BfType* wantType, BfCo
|
||||||
if (isConst)
|
if (isConst)
|
||||||
{
|
{
|
||||||
auto constant = mModule->mBfIRBuilder->GetConstant(mResult.mValue);
|
auto constant = mModule->mBfIRBuilder->GetConstant(mResult.mValue);
|
||||||
if ((constant->mConstType == BfConstType_GlobalVar) && ((flags & BfConstResolveFlag_AllowGlobalVariable) == 0))
|
|
||||||
|
if ((constant->mTypeCode != BfTypeCode_StringId) && (mModule->HasStringId(mResult.mValue, mModule->mBfIRBuilder)))
|
||||||
|
{
|
||||||
|
mModule->Fail("Invalid usage of string constant", expr);
|
||||||
|
mResult = BfTypedValue();
|
||||||
|
}
|
||||||
|
else if ((constant->mConstType == BfConstType_GlobalVar) && ((flags & BfConstResolveFlag_AllowGlobalVariable) == 0))
|
||||||
{
|
{
|
||||||
int stringId = mModule->GetStringPoolIdx(mResult.mValue, mModule->mBfIRBuilder);
|
int stringId = mModule->GetStringPoolIdx(mResult.mValue, mModule->mBfIRBuilder);
|
||||||
if (stringId != -1)
|
if (stringId != -1)
|
||||||
|
|
|
@ -1766,6 +1766,29 @@ BfIRValue BfModule::CreateStringObjectValue(const StringImpl& str, int stringId,
|
||||||
return stringValLiteral;
|
return stringValLiteral;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool BfModule::HasStringId(BfIRValue constantStr, BfIRConstHolder* constHolder)
|
||||||
|
{
|
||||||
|
if (constHolder == NULL)
|
||||||
|
constHolder = mBfIRBuilder;
|
||||||
|
|
||||||
|
auto constant = constHolder->GetConstant(constantStr);
|
||||||
|
if (constant == NULL)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
while (constant->mConstType == BfConstType_BitCast)
|
||||||
|
{
|
||||||
|
auto constBitCast = (BfConstantBitCast*)constant;
|
||||||
|
constant = constHolder->GetConstantById(constBitCast->mTarget);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (constant->mTypeCode == BfTypeCode_StringId)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
int BfModule::GetStringPoolIdx(BfIRValue constantStr, BfIRConstHolder* constHolder)
|
int BfModule::GetStringPoolIdx(BfIRValue constantStr, BfIRConstHolder* constHolder)
|
||||||
{
|
{
|
||||||
if (constHolder == NULL)
|
if (constHolder == NULL)
|
||||||
|
|
|
@ -1652,6 +1652,7 @@ public:
|
||||||
void FixConstValueParams(BfTypeInstance* typeInst, SizedArrayImpl<BfIRValue>& valueParams, bool fillInPadding = false);
|
void FixConstValueParams(BfTypeInstance* typeInst, SizedArrayImpl<BfIRValue>& valueParams, bool fillInPadding = false);
|
||||||
BfIRValue CreateStringObjectValue(const StringImpl& str, int stringId, bool define);
|
BfIRValue CreateStringObjectValue(const StringImpl& str, int stringId, bool define);
|
||||||
BfIRValue CreateStringCharPtr(const StringImpl& str, int stringId, bool define);
|
BfIRValue CreateStringCharPtr(const StringImpl& str, int stringId, bool define);
|
||||||
|
bool HasStringId(BfIRValue constantStr, BfIRConstHolder* constHolder = NULL);
|
||||||
int GetStringPoolIdx(BfIRValue constantStr, BfIRConstHolder* constHolder = NULL);
|
int GetStringPoolIdx(BfIRValue constantStr, BfIRConstHolder* constHolder = NULL);
|
||||||
String* GetStringPoolString(BfIRValue constantStr, BfIRConstHolder* constHolder = NULL);
|
String* GetStringPoolString(BfIRValue constantStr, BfIRConstHolder* constHolder = NULL);
|
||||||
BfIRValue GetStringCharPtr(int stringId, bool force = false);
|
BfIRValue GetStringCharPtr(int stringId, bool force = false);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue