diff --git a/IDEHelper/Compiler/BfConstResolver.cpp b/IDEHelper/Compiler/BfConstResolver.cpp index 1c559260..c6e87b45 100644 --- a/IDEHelper/Compiler/BfConstResolver.cpp +++ b/IDEHelper/Compiler/BfConstResolver.cpp @@ -184,7 +184,13 @@ BfTypedValue BfConstResolver::Resolve(BfExpression* expr, BfType* wantType, BfCo if (isConst) { 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); if (stringId != -1) @@ -193,7 +199,7 @@ BfTypedValue BfConstResolver::Resolve(BfExpression* expr, BfType* wantType, BfCo } else isConst = false; - } + } } if ((!isConst) && ((mBfEvalExprFlags & BfEvalExprFlags_AllowNonConst) == 0)) diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index dd14d598..4676a821 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -1766,6 +1766,29 @@ BfIRValue BfModule::CreateStringObjectValue(const StringImpl& str, int stringId, 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) { if (constHolder == NULL) diff --git a/IDEHelper/Compiler/BfModule.h b/IDEHelper/Compiler/BfModule.h index 78c29be4..374564dd 100644 --- a/IDEHelper/Compiler/BfModule.h +++ b/IDEHelper/Compiler/BfModule.h @@ -1652,6 +1652,7 @@ public: void FixConstValueParams(BfTypeInstance* typeInst, SizedArrayImpl& valueParams, bool fillInPadding = false); BfIRValue CreateStringObjectValue(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); String* GetStringPoolString(BfIRValue constantStr, BfIRConstHolder* constHolder = NULL); BfIRValue GetStringCharPtr(int stringId, bool force = false);