1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-07 19:18:19 +02:00

Trailing whitespace trimming

This commit is contained in:
Brian Fiete 2022-07-26 13:27:03 -04:00
parent 06425735d9
commit 7f328385db
88 changed files with 9577 additions and 9850 deletions

View file

@ -7,7 +7,6 @@ struct CV_LVAR_ADDR_GAP;
NS_BF_BEGIN
#define PE_SIZEOF_SHORT_NAME 8
#define PE_DIRECTORY_ENTRY_EXPORT 0 // Export Directory
#define PE_NUMBEROF_DIRECTORY_ENTRIES 16
@ -17,7 +16,6 @@ NS_BF_BEGIN
#define PE_MACHINE_X86 0x14c
#define PE_MACHINE_X64 0x8664
// DOS .EXE header
struct PEHeader
{
@ -174,8 +172,8 @@ struct PE_NTHeaders64
struct PESectionHeader
{
char mName[IMAGE_SIZEOF_SHORT_NAME];
DWORD mVirtualSize;
char mName[IMAGE_SIZEOF_SHORT_NAME];
DWORD mVirtualSize;
DWORD mVirtualAddress;
DWORD mSizeOfRawData;
DWORD mPointerToRawData;
@ -234,8 +232,8 @@ struct PE_SymInfoAux
// int GetPrologSize() const { return mAttributes & 0xF; }
//
// // # regs saved
// int GetNumSavedRegs() const { return (mAttributes >> 8) & 0x7; }
// bool HasSEH() const { return (mAttributes >> 9) & 1; }
// int GetNumSavedRegs() const { return (mAttributes >> 8) & 0x7; }
// bool HasSEH() const { return (mAttributes >> 9) & 1; }
// bool UseBP() const { return (mAttributes >> 10) & 1; }
//
// // cbFrame: frame pointer
@ -279,7 +277,7 @@ struct COFFFrameProgram
Command_Align,
Command_Set,
Command_Deref,
Command_Value,
Command_Value,
Command_Value8
};

View file

@ -17,11 +17,11 @@ BfStructuralVisitor::BfStructuralVisitor()
}
void BfStructuralVisitor::VisitMembers(BfBlock* node)
{
{
for (auto& child : *node)
{
{
child->Accept(this);
}
}
}
void BfStructuralVisitor::VisitChildNoRef(BfAstNode* node)
@ -673,7 +673,7 @@ void BfStructuralVisitor::Visit(BfNamespaceDeclaration* namespaceDeclaration)
void BfStructuralVisitor::Visit(BfBlock* block)
{
Visit(block->ToBase());
Visit(block->ToBase());
}
void BfStructuralVisitor::Visit(BfUnscopedBlock* block)
@ -688,7 +688,7 @@ void BfStructuralVisitor::Visit(BfBlockExtension* block)
void BfStructuralVisitor::Visit(BfRootNode* rootNode)
{
Visit(rootNode->ToBase());
Visit(rootNode->ToBase());
}
void BfStructuralVisitor::Visit(BfInlineAsmStatement* asmStmt)
@ -715,7 +715,7 @@ BfAstTypeInfo::BfAstTypeInfo(const char* name, BfAstTypeInfo* baseType, BfAstAcc
if (mBaseType != NULL)
{
mBaseType->mDerivedTypes.Add(this);
}
}
sTypeCount++;
#ifdef _DEBUG
@ -800,7 +800,7 @@ bool BfAstNode::IsMissingSemicolon()
return (attribExpr->mStatement == NULL) || (attribExpr->mStatement->IsMissingSemicolon());
if (auto stmt = BfNodeDynCast<BfStatement>(this))
return stmt->mTrailingSemicolon == NULL;
return stmt->mTrailingSemicolon == NULL;
return false;
}
@ -832,7 +832,7 @@ bool BfAstNode::WantsWarning(int warningNumber)
}
bool BfAstNode::LocationEquals(BfAstNode* otherNode)
{
{
return (GetSourceData() == otherNode->GetSourceData()) &&
(GetSrcStart() == otherNode->GetSrcStart()) &&
(GetSrcEnd() == otherNode->GetSrcEnd());
@ -851,7 +851,7 @@ String BfAstNode::LocationToString()
return String();
String loc;
int line = -1;
int lineChar = -1;
parserData->GetLineCharAtIdx(mSrcStart, line, lineChar);
@ -864,10 +864,10 @@ String BfAstNode::LocationToString()
}
void BfAstNode::Add(BfAstNode* bfAstNode)
{
{
#ifdef BF_AST_HAS_PARENT_MEMBER
BF_ASSERT(bfAstNode->mParent == NULL);
bfAstNode->mParent = this;
bfAstNode->mParent = this;
#endif
if (!IsInitialized())
@ -897,7 +897,7 @@ void BfAstNode::Add(BfAstNode* bfAstNode)
SetSrcStart(childSrcStart);
if (childSrcEnd > prevSrcEnd)
SetSrcEnd(childSrcEnd);
#else
#else
BF_ASSERT(mSrcStart >= 0);
BF_ASSERT(bfAstNode->mSrcStart >= 0);
@ -934,14 +934,14 @@ void BfAstNode::RemoveNextSibling()
}
void BfAstNode::DeleteNextSibling()
{
{
//mNext->DeleteSelf();
}
void BfAstNode::Init(BfParser* bfParser)
{
BF_ASSERT(GetSourceData() == bfParser->mSourceData);
Init(bfParser->mTriviaStart, bfParser->mTokenStart, bfParser->mTokenEnd);
Init(bfParser->mTriviaStart, bfParser->mTokenStart, bfParser->mTokenEnd);
}
void BfAstNode::Accept(BfStructuralVisitor* bfVisitor)
@ -960,7 +960,7 @@ bool BfAstNode::IsTemporary()
int BfAstNode::GetStartCharId()
{
if (!IsTemporary())
if (!IsTemporary())
{
auto bfParser = GetSourceData()->ToParserData();
if (bfParser != NULL)
@ -970,8 +970,8 @@ int BfAstNode::GetStartCharId()
}
BfSourceData* BfAstNode::GetSourceData()
{
#ifdef BF_AST_ALLOCATOR_USE_PAGES
{
#ifdef BF_AST_ALLOCATOR_USE_PAGES
//BF_ASSERT((intptr)this > 0x4200000000);
BfAstPageHeader* pageHeader = (BfAstPageHeader*)((intptr)this & ~(BfAstAllocManager::PAGE_SIZE - 1));
return pageHeader->mSourceData;
@ -1021,14 +1021,14 @@ String BfAstNode::ToString()
int srcLen = GetSrcLength();
if (srcLen <= 0)
{
if (auto namedTypeRef = BfNodeDynCast<BfNamedTypeReference>(this))
return namedTypeRef->mNameNode->ToString();
if (auto namedTypeRef = BfNodeDynCast<BfNamedTypeReference>(this))
return namedTypeRef->mNameNode->ToString();
return "";
}
auto source = GetSourceData();
String str(source->mSrc + GetSrcStart(), srcLen);
String str(source->mSrc + GetSrcStart(), srcLen);
return str;
}
@ -1057,7 +1057,7 @@ void BfAstNode::ToString(StringImpl& str)
}
auto source = GetSourceData();
str.Append(source->mSrc + GetSrcStart(), srcLen);
str.Append(source->mSrc + GetSrcStart(), srcLen);
}
bool BfAstNode::Equals(const StringImpl& str)
@ -1079,7 +1079,7 @@ bool BfAstNode::Equals(const StringView& str)
}
bool BfAstNode::Equals(const char* str)
{
{
auto source = GetSourceData();
const char* ptrLhs = source->mSrc + mSrcStart;
const char* ptrLhsEnd = source->mSrc + mSrcEnd;
@ -1087,7 +1087,7 @@ bool BfAstNode::Equals(const char* str)
while (true)
{
char cRhs = *(ptrRhs++);
char cRhs = *(ptrRhs++);
if (cRhs == 0)
return ptrLhs == ptrLhsEnd;
if (ptrLhs == ptrLhsEnd)
@ -1098,7 +1098,6 @@ bool BfAstNode::Equals(const char* str)
}
}
//////////////////////////////////////////////////////////////////////////
void BfBlock::Init(const SizedArrayImpl<BfAstNode*>& vec, BfAstAllocator* alloc)
@ -1112,18 +1111,18 @@ void BfBlock::Init(const SizedArrayImpl<BfAstNode*>& vec, BfAstAllocator* alloc)
{
int bytesLeft = alloc->GetCurPageBytesLeft();
int useElems = std::min(bytesLeft / (int)sizeof(ASTREF(BfAstNode*)), elemsLeft);
BfBlockExtension* nextExt = NULL;
BfBlockExtension* nextExt = NULL;
BfSizedArray<ASTREF(BfAstNode*)>& childArrRef = (curExt != NULL) ? curExt->mChildArr : mChildArr;
childArrRef.mVals = (ASTREF(BfAstNode*)*)alloc->AllocBytes(useElems * sizeof(ASTREF(BfAstNode*)), sizeof(ASTREF(BfAstNode*)));
childArrRef.mSize = useElems;
if (useElems < elemsLeft)
if (useElems < elemsLeft)
{
nextExt = alloc->Alloc<BfBlockExtension>();
useElems--;
}
for (int i = 0; i < useElems; i++)
childArrRef[i] = vec[curIdx++];
childArrRef[i] = vec[curIdx++];
if (nextExt != NULL)
{
childArrRef[useElems] = nextExt;
@ -1131,7 +1130,7 @@ void BfBlock::Init(const SizedArrayImpl<BfAstNode*>& vec, BfAstAllocator* alloc)
}
elemsLeft -= useElems;
}
#else
#else
BfSizedArrayInitIndirect(mChildArr, vec, alloc);
#endif
}
@ -1157,10 +1156,10 @@ int BfBlock::GetSize()
{
int size = mChildArr.mSize;
if (mChildArr.mSize == 0)
return size;
return size;
BfAstNode* backNode = mChildArr.mVals[mChildArr.mSize - 1];
while (true)
{
{
if (auto blockExt = BfNodeDynCastExact<BfBlockExtension>(backNode))
{
size--;
@ -1172,12 +1171,12 @@ int BfBlock::GetSize()
break;
}
}
return size;
}
void BfBlock::SetSize(int wantSize)
{
{
int size = mChildArr.mSize;
if (wantSize == size)
return;
@ -1390,7 +1389,7 @@ const char* Beefy::BfTokenToString(BfToken token)
case BfToken_Extension:
return "extension";
case BfToken_Fallthrough:
return "fallthrough";
return "fallthrough";
case BfToken_Finally:
return "finally";
case BfToken_Fixed:
@ -1426,7 +1425,7 @@ const char* Beefy::BfTokenToString(BfToken token)
case BfToken_Namespace:
return "namespace";
case BfToken_New:
return "new";
return "new";
case BfToken_Null:
return "null";
case BfToken_Nullable:
@ -1578,7 +1577,7 @@ const char* Beefy::BfTokenToString(BfToken token)
case BfToken_Colon:
return ":";
case BfToken_Comma:
return ",";
return ",";
case BfToken_Dot:
case BfToken_AutocompleteDot:
return ".";
@ -1645,7 +1644,7 @@ bool Beefy::BfTokenIsKeyword(BfToken token)
BfBinaryOp Beefy::BfAssignOpToBinaryOp(BfAssignmentOp assignmentOp)
{
switch (assignmentOp)
{
{
case BfAssignmentOp_Add:
return BfBinaryOp_Add;
case BfAssignmentOp_Subtract:
@ -1681,9 +1680,9 @@ BfBinaryOp Beefy::BfAssignOpToBinaryOp(BfAssignmentOp assignmentOp)
}
int Beefy::BfGetBinaryOpPrecendence(BfBinaryOp binOp)
{
{
switch (binOp)
{
{
case BfBinaryOp_Multiply:
case BfBinaryOp_OverflowMultiply:
case BfBinaryOp_Divide:
@ -1693,7 +1692,7 @@ int Beefy::BfGetBinaryOpPrecendence(BfBinaryOp binOp)
case BfBinaryOp_Subtract:
case BfBinaryOp_OverflowAdd:
case BfBinaryOp_OverflowSubtract:
return 13;
return 13;
case BfBinaryOp_LeftShift:
case BfBinaryOp_RightShift:
return 12;
@ -1722,7 +1721,7 @@ int Beefy::BfGetBinaryOpPrecendence(BfBinaryOp binOp)
case BfBinaryOp_StrictInEquality:
return 4;
case BfBinaryOp_ConditionalAnd:
return 3;
return 3;
case BfBinaryOp_ConditionalOr:
return 2;
case BfBinaryOp_NullCoalesce:
@ -1797,7 +1796,7 @@ const char* Beefy::BfGetOpName(BfUnaryOp unaryOp)
case BfUnaryOp_FromEnd: return "^";
case BfUnaryOp_PartialRangeUpTo: return "..<";
case BfUnaryOp_PartialRangeThrough: return "...";
case BfUnaryOp_PartialRangeFrom: return "...";
case BfUnaryOp_PartialRangeFrom: return "...";
default: return "???";
}
}
@ -1929,7 +1928,6 @@ bool Beefy::BfCanOverloadOperator(BfUnaryOp unaryOp)
}
}
BfAssignmentOp Beefy::BfTokenToAssignmentOp(BfToken token)
{
switch (token)
@ -1941,7 +1939,7 @@ BfAssignmentOp Beefy::BfTokenToAssignmentOp(BfToken token)
case BfToken_MinusEquals:
return BfAssignmentOp_Subtract;
case BfToken_MultiplyEquals:
return BfAssignmentOp_Multiply;
return BfAssignmentOp_Multiply;
case BfToken_AndPlusEquals:
return BfAssignmentOp_OverflowAdd;
case BfToken_AndMinusEquals:
@ -2143,4 +2141,4 @@ String BfInlineAsmInstruction::AsmInst::ToString()
}
return s;
}
}

File diff suppressed because it is too large Load diff

View file

@ -24,36 +24,35 @@ void BfBitSet::Init(int numBits)
memset(mBits, 0, numInts * 4);
}
bool BfBitSet::IsSet(int idx)
{
return (mBits[idx / 32] & (1 << (idx % 32))) != 0;
}
void BfBitSet::Set(int idx)
{
{
mBits[idx / 32] |= (1 << (idx % 32));
}
void BfBitSet::Clear(int idx)
{
{
mBits[idx / 32] &= ~(1 << (idx % 32));
}
//////////////////////////////////////////////////////////////////////////
BfAstAllocator::BfAstAllocator()
{
{
mSourceData = NULL;
mCurPtr = NULL;
mCurPageEnd = mCurPtr;
mCurPtr = NULL;
mCurPageEnd = mCurPtr;
mLargeAllocSizes = 0;
mNumPagesUsed = 0;
mNumPagesUsed = 0;
mUsedSize = 0;
}
BfAstAllocator::~BfAstAllocator()
{
{
for (auto addr : mLargeAllocs)
delete [] (uint8*)addr;
if (mPages.size() != 0)
@ -61,16 +60,16 @@ BfAstAllocator::~BfAstAllocator()
}
void BfAstAllocator::InitChunkHead(int wantSize)
{
{
mCurPtr = mSourceData->mAstAllocManager->AllocPage();
mPages.push_back(mCurPtr);
mCurPageEnd = mCurPtr + BfAstAllocManager::PAGE_SIZE;
mNumPagesUsed++;
#ifdef BF_AST_ALLOCATOR_USE_PAGES
#ifdef BF_AST_ALLOCATOR_USE_PAGES
BfAstPageHeader* pageHeader = (BfAstPageHeader*)mCurPtr;
pageHeader->mSourceData = mSourceData;
BF_ASSERT(sizeof(BfAstPageHeader) <= 16);
mCurPtr += 16;
mCurPtr += 16;
#endif
}
@ -95,28 +94,28 @@ BfAstAllocManager::~BfAstAllocManager()
#endif
}
//TODO: Remove this
//TODO: Remove this
//static int gAstChunkAllocCount = 0;
uint8* BfAstAllocManager::AllocPage()
{
#ifdef BF_AST_ALLOCATOR_USE_PAGES
AutoCrit autoCrit(mCritSect);
if (mFreePageCount != 0)
if (mFreePageCount != 0)
{
mFreePageCount--;
return (uint8*)mFreePages.PopFront();
}
BF_ASSERT(mFreePages.mHead == NULL);
//auto newChunk = (uint8*)::VirtualAlloc((void*)(0x4200000000 + gAstChunkAllocCount*CHUNK_SIZE), CHUNK_SIZE, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
//gAstChunkAllocCount++;
auto newChunk = (uint8*)::VirtualAlloc(NULL, CHUNK_SIZE, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
BF_ASSERT(newChunk != NULL);
BF_ASSERT(((intptr)newChunk & (PAGE_SIZE - 1)) == 0);
mAllocChunks.push_back(newChunk);
BF_ASSERT(((intptr)newChunk & (PAGE_SIZE - 1)) == 0);
mAllocChunks.push_back(newChunk);
//BfLog("BfAstAllocManager alloc %p\n", newChunk);
@ -128,7 +127,7 @@ uint8* BfAstAllocManager::AllocPage()
}
mFreePageCount--;
return (uint8*)mFreePages.PopFront();
return (uint8*)mFreePages.PopFront();
#else
return new uint8[PAGE_SIZE];
#endif

View file

@ -49,14 +49,13 @@ public:
class BfAstPageHeader
{
public:
BfSourceData* mSourceData;
BfSourceData* mSourceData;
};
#endif
class BfAstAllocChunk;
class BfAstAllocManager;
struct BfAstFreePage
{
BfAstFreePage* mNext;
@ -75,7 +74,7 @@ public:
Array<uint8*> mAllocChunks;
#endif
public:
public:
BfAstAllocManager();
~BfAstAllocManager();
@ -90,7 +89,7 @@ public:
// {
// int mCount;
// int mSize;
//
//
// BumpAllocTrackedEntry()
// {
// mCount = 0;
@ -103,9 +102,9 @@ class BfAstAllocator
{
public:
static const int LARGE_ALLOC_SIZE = 2048;
BfSourceData* mSourceData;
uint8* mCurPtr;
uint8* mCurPageEnd;
BfSourceData* mSourceData;
uint8* mCurPtr;
uint8* mCurPageEnd;
Array<void*> mLargeAllocs;
Array<uint8*> mPages;
int mLargeAllocSizes;
@ -117,8 +116,8 @@ public:
public:
BfAstAllocator();
~BfAstAllocator();
~BfAstAllocator();
void InitChunkHead(int wantSize);
int GetAllocSize() const
@ -141,7 +140,7 @@ public:
{
int alignSize = alignof(T);
mCurPtr = (uint8*)(((intptr)mCurPtr + alignSize - 1) & ~(alignSize - 1));
int wantSize = sizeof(T) + extraBytes;
int wantSize = sizeof(T) + extraBytes;
#ifdef BUMPALLOC_TRACKALLOCS
const char* name = typeid(T).name();
@ -152,10 +151,10 @@ public:
#endif
if (mCurPtr + wantSize >= mCurPageEnd)
InitChunkHead(wantSize);
InitChunkHead(wantSize);
memset(mCurPtr, 0, wantSize);
T* retVal = new (mCurPtr) T();
mCurPtr += wantSize;
T* retVal = new (mCurPtr) T();
mCurPtr += wantSize;
#ifndef BF_AST_ALLOCATOR_USE_PAGES
retVal->mSourceData = this->mSourceData;
@ -165,8 +164,8 @@ public:
}
uint8* AllocBytes(int wantSize, int alignSize, const char* dbgName = "AllocBytes")
{
#ifdef BUMPALLOC_TRACKALLOCS
{
#ifdef BUMPALLOC_TRACKALLOCS
BumpAllocTrackedEntry* allocSizePtr;
mTrackedAllocs.TryAdd(dbgName, NULL, &allocSizePtr);
allocSizePtr->mCount++;
@ -188,13 +187,13 @@ public:
InitChunkHead(wantSize);
memset(mCurPtr, 0, wantSize);
uint8* retVal = mCurPtr;
mCurPtr += wantSize;
mCurPtr += wantSize;
return retVal;
}
uint8* AllocBytes(int wantSize, const char* dbgName = "AllocBytes")
{
#ifdef BUMPALLOC_TRACKALLOCS
#ifdef BUMPALLOC_TRACKALLOCS
BumpAllocTrackedEntry* allocSizePtr;
mTrackedAllocs.TryAdd(dbgName, NULL, &allocSizePtr);
allocSizePtr->mCount++;
@ -211,12 +210,10 @@ public:
if (mCurPtr + wantSize >= mCurPageEnd)
InitChunkHead(wantSize);
memset(mCurPtr, 0, wantSize);
uint8* retVal = mCurPtr;
uint8* retVal = mCurPtr;
mCurPtr += wantSize;
return retVal;
}
};
NS_BF_END

File diff suppressed because it is too large Load diff

View file

@ -62,7 +62,7 @@ public:
}
bool operator==(const AutoCompleteEntry& other) const
{
{
return strcmp(mDisplay, other.mDisplay) == 0;
}
};
@ -73,7 +73,7 @@ template <>
struct BeefHash<Beefy::AutoCompleteEntry>
{
size_t operator()(const Beefy::AutoCompleteEntry& val)
{
{
intptr hash = 0;
const char* curPtr = val.mDisplay;
while (true)
@ -92,7 +92,7 @@ NS_BF_BEGIN
class AutoCompleteBase
{
public:
public:
class EntryLess
{
public:
@ -103,7 +103,7 @@ public:
result = strcmp(left.mDisplay, right.mDisplay);
return result < 0;
}
};
};
public:
BumpAllocator mAlloc;
@ -128,13 +128,13 @@ public:
class BfAutoComplete : public AutoCompleteBase
{
public:
public:
class MethodMatchEntry
{
public:
public:
BfMethodDef* mMethodDef;
BfFieldInstance* mPayloadEnumField;
BfTypeInstance* mTypeInstance;
BfTypeInstance* mTypeInstance;
BfTypeVector mGenericArguments;
BfMethodInstance* mCurMethodInstance;
@ -142,34 +142,34 @@ public:
{
mMethodDef = NULL;
mPayloadEnumField = NULL;
mTypeInstance = NULL;
mTypeInstance = NULL;
mCurMethodInstance = NULL;
}
};
class MethodMatchInfo
{
public:
public:
BfTypeInstance* mCurTypeInstance;
BfMethodInstance* mCurMethodInstance;
Array<MethodMatchEntry> mInstanceList;
int mInvocationSrcIdx;
int mBestIdx;
int mPrevBestIdx;
int mBestIdx;
int mPrevBestIdx;
bool mHadExactMatch;
int mMostParamsMatched;
int mMostParamsMatched;
Array<int> mSrcPositions; // start, commas, end
public:
MethodMatchInfo()
{
mInvocationSrcIdx = -1;
mCurTypeInstance = NULL;
mCurMethodInstance = NULL;
mBestIdx = 0;
mPrevBestIdx = -1;
mBestIdx = 0;
mPrevBestIdx = -1;
mHadExactMatch = false;
mMostParamsMatched = 0;
mMostParamsMatched = 0;
}
~MethodMatchInfo()
@ -177,10 +177,10 @@ public:
}
};
public:
public:
BfModule* mModule;
BfCompiler* mCompiler;
BfSystem* mSystem;
BfSystem* mSystem;
MethodMatchInfo* mMethodMatchInfo;
bool mIsCapturingMethodMatchInfo;
String mDefaultSelection;
@ -196,8 +196,8 @@ public:
bool mForceAllowNonStatic;
int mCursorLineStart;
int mCursorLineEnd;
int mReplaceLocalId;
int mReplaceLocalId;
BfMethodDef* mDefMethod;
BfTypeDef* mDefType;
BfFieldDef* mDefField;
@ -206,7 +206,7 @@ public:
int mDefMethodGenericParamIdx;
int mDefTypeGenericParamIdx;
public:
public:
BfProject* GetActiveProject();
bool WantsEntries();
bool CheckProtection(BfProtection protection, BfTypeDef* typeDef, bool allowProtected, bool allowPrivate);
@ -216,9 +216,9 @@ public:
bool IsAutocompleteNode(BfAstNode* node, int lengthAdd = 0, int startAdd = 0);
bool IsAutocompleteNode(BfAstNode* startNode, BfAstNode* endNode, int lengthAdd = 0, int startAdd = 0);
bool IsAutocompleteLineNode(BfAstNode* node);
BfTypedValue LookupTypeRefOrIdentifier(BfAstNode* node, bool* isStatic, BfEvalExprFlags evalExprFlags = BfEvalExprFlags_None, BfType* expectingType = NULL);
BfTypedValue LookupTypeRefOrIdentifier(BfAstNode* node, bool* isStatic, BfEvalExprFlags evalExprFlags = BfEvalExprFlags_None, BfType* expectingType = NULL);
void SetDefinitionLocation(BfAstNode* astNode, bool force = false);
bool IsAttribute(BfTypeInstance* typeInst);
bool IsAttribute(BfTypeInstance* typeInst);
void AddMethod(BfTypeInstance* typeInstance, BfMethodDef* methodDef, BfMethodInstance* methodInstance, BfMethodDeclaration* methodDecl, const StringImpl& methodName, const StringImpl& filter);
void AddField(BfTypeInstance* typeInst, BfFieldDef* fieldDef, BfFieldInstance* fieldInstance, const StringImpl& filter);
void AddProp(BfTypeInstance* typeInst, BfPropertyDef* propDef, const StringImpl& filter);
@ -228,26 +228,26 @@ public:
void AddTypeMembers(BfTypeInstance* typeInst, bool addStatic, bool addNonStatic, const StringImpl& filter, BfTypeInstance* startType, bool allowInterfaces, bool allowImplicitThis, bool checkOuterType);
void AddSelfResultTypeMembers(BfTypeInstance* typeInst, BfTypeInstance* selfType, const StringImpl& filter, bool allowPrivate);
bool InitAutocomplete(BfAstNode* dotNode, BfAstNode* nameNode, String& filter);
void AddEnumTypeMembers(BfTypeInstance* typeInst, const StringImpl& filter, bool allowProtected, bool allowPrivate);
void AddEnumTypeMembers(BfTypeInstance* typeInst, const StringImpl& filter, bool allowProtected, bool allowPrivate);
void AddExtensionMethods(BfTypeInstance* targetType, BfTypeInstance* extensionContainer, const StringImpl& filter, bool allowProtected, bool allowPrivate);
void AddTopLevelNamespaces(BfAstNode* identifierNode);
void AddTopLevelTypes(BfAstNode* identifierNode, bool onlyAttribute = false);
void AddOverrides(const StringImpl& filter);
void UpdateReplaceData();
void UpdateReplaceData();
void AddTypeInstanceEntry(BfTypeInstance* typeInst);
bool CheckDocumentation(AutoCompleteEntry* entry, BfCommentNode* documentation);
bool GetMethodInfo(BfMethodInstance* methodInst, StringImpl* methodName, StringImpl* insertString, bool isImplementing, bool isExplicitInterface);
void FixitGetParamString(const BfTypeVector& paramTypes, StringImpl& outStr);
int FixitGetMemberInsertPos(BfTypeDef* typeDef);
String FixitGetLocation(BfParserData* parserData, int insertPos);
String ConstantToString(BfIRConstHolder* constHolder, BfIRValue id);
String ConstantToString(BfIRConstHolder* constHolder, BfIRValue id);
public:
BfAutoComplete(BfResolveType resolveType = BfResolveType_Autocomplete, bool doFuzzyAutoComplete = false);
~BfAutoComplete();
void SetModule(BfModule* module);
void Clear();
void Clear();
void RemoveMethodMatchInfo();
void ClearMethodMatchEntries();
@ -256,21 +256,21 @@ public:
bool CheckExplicitInterface(BfTypeInstance* interfaceType, BfAstNode* dotToken, BfAstNode* memberName);
void CheckTypeRef(BfTypeReference* typeRef, bool mayBeIdentifier, bool isInExpression = false, bool onlyAttribute = false);
void CheckAttributeTypeRef(BfTypeReference* typeRef);
void CheckInvocation(BfAstNode* invocationNode, BfTokenNode* openParen, BfTokenNode* closeParen, const BfSizedArray<BfTokenNode*>& commas);
void CheckInvocation(BfAstNode* invocationNode, BfTokenNode* openParen, BfTokenNode* closeParen, const BfSizedArray<BfTokenNode*>& commas);
void CheckNode(BfAstNode* node, bool mayBeIdentifier, bool isInExpression = false);
void CheckMethod(BfMethodDeclaration* methodDeclaration, bool isLocalMethod);
void CheckProperty(BfPropertyDeclaration* propertyDeclaration);
void CheckProperty(BfPropertyDeclaration* propertyDeclaration);
void CheckVarResolution(BfAstNode* varTypeRef, BfType* resolvedTypeRef);
void CheckResult(BfAstNode* node, const BfTypedValue& typedValue);
void CheckLocalDef(BfAstNode* identifierNode, BfLocalVariable* varDecl);
void CheckLocalRef(BfAstNode* identifierNode, BfLocalVariable* varDecl);
void CheckFieldRef(BfAstNode* identifierNode, BfFieldInstance* fieldInst);
void CheckFieldRef(BfAstNode* identifierNode, BfFieldInstance* fieldInst);
void CheckLabel(BfIdentifierNode* identifierNode, BfAstNode* precedingNode, BfScopeData* scopeData);
void CheckNamespace(BfAstNode* node, const BfAtomComposite& namespaceName);
void CheckEmptyStart(BfAstNode* prevNode, BfType* type);
bool CheckFixit(BfAstNode* node);
void CheckEmptyStart(BfAstNode* prevNode, BfType* type);
bool CheckFixit(BfAstNode* node);
void CheckInterfaceFixit(BfTypeInstance* typeInstance, BfAstNode* node);
void FixitAddMember(BfTypeInstance* typeInst, BfType* fieldType, const StringImpl& fieldName, bool isStatic, BfTypeInstance* referencedFrom);
void FixitAddCase(BfTypeInstance * typeInst, const StringImpl & caseName, const BfTypeVector & fieldTypes);
void FixitAddMethod(BfTypeInstance* typeInst, const StringImpl& methodName, BfType* returnType, const BfTypeVector& paramTypes, bool wantStatic);

View file

@ -57,7 +57,6 @@
USING_NS_BF;
using namespace llvm;
String BfCodeGenDirectoryData::GetDataFileName()
{
return mDirectoryName + "/build.dat";
@ -89,7 +88,7 @@ void BfCodeGenDirectoryData::Read()
for (int fileIdx = 0; fileIdx < numFiles; fileIdx++)
{
String fileName = fileStream.ReadAscii32SizedString();
BfCodeGenFileData fileData;
BfCodeGenFileData fileData;
fileStream.Read(&fileData.mIRHash, sizeof(Val128));
fileStream.Read(&fileData.mIROrderedHash, sizeof(Val128));
fileStream.Read(&fileData.mLastWasObjectWrite, sizeof(bool));
@ -159,7 +158,7 @@ void BfCodeGenDirectoryData::Write()
}
void BfCodeGenDirectoryData::Verify()
{
{
if (!mError.empty())
return;
@ -171,12 +170,12 @@ void BfCodeGenDirectoryData::Verify()
}
else
{
mError = "Build directory corrupted, perform clean";
}
mError = "Build directory corrupted, perform clean";
}
}
void BfCodeGenDirectoryData::Clear()
{
{
mFileMap.Clear();
mBuildSettings.Clear();
}
@ -187,16 +186,16 @@ bool BfCodeGenDirectoryData::CheckCache(const StringImpl& fileName, Val128 hash,
Verify();
BfCodeGenFileData* fileData = NULL;
if (!mFileMap.TryAdd(fileName, NULL, &fileData))
{
{
if ((fileData->mLastWasObjectWrite) && (disallowObjectWrite))
return false;
if (outOrderedHash != NULL)
*outOrderedHash = fileData->mIROrderedHash;
if (fileData->mIRHash == hash)
return true;
fileData->mIRHash = hash;
if (fileData->mIRHash == hash)
return true;
fileData->mIRHash = hash;
return false;
}
@ -212,9 +211,9 @@ void BfCodeGenDirectoryData::SetHash(const StringImpl& fileName, Val128 hash, Va
BfCodeGenFileData* fileData = NULL;
mFileMap.TryAdd(fileName, NULL, &fileData);
mFileMap.TryAdd(fileName, NULL, &fileData);
fileData->mIRHash = hash;
fileData->mIROrderedHash = orderedHash;
fileData->mIROrderedHash = orderedHash;
fileData->mLastWasObjectWrite = isObjectWrite;
}
@ -223,7 +222,6 @@ void BfCodeGenDirectoryData::ClearHash(const StringImpl& fileName)
mFileMap.Remove(fileName);
}
void BfCodeGenDirectoryData::FileFailed()
{
mFileFailed = true;
@ -240,7 +238,7 @@ String BfCodeGenDirectoryData::GetValue(const StringImpl& key)
}
void BfCodeGenDirectoryData::SetValue(const StringImpl& key, const StringImpl& value)
{
{
mBuildSettings[key] = value;
}
@ -265,16 +263,16 @@ void DbgSaveData(BfCodeGenRequest* genRequest)
//////////////////////////////////////////////////////////////////////////
BfCodeGenThread::BfCodeGenThread()
{
{
mShuttingDown = false;
mRunning = false;
mRunning = false;
mThreadIdx = 0;
mCodeGen = NULL;
}
BfCodeGenThread::~BfCodeGenThread()
{
Shutdown();
Shutdown();
}
void BfCodeGenThread::RunLoop()
@ -282,21 +280,21 @@ void BfCodeGenThread::RunLoop()
String threadName = StrFormat("CodeGen/Worker %d", mThreadIdx);
BpSetThreadName(threadName.c_str());
BfpThread_SetName(NULL, threadName.c_str(), NULL);
while (!mShuttingDown)
{
{
BfCodeGenRequest* request = NULL;
{
AutoCrit autoCrit(mCodeGen->mPendingRequestCritSect);
if (!mCodeGen->mPendingRequests.IsEmpty())
{
request = mCodeGen->mPendingRequests[0];
mCodeGen->mPendingRequests.RemoveAt(0);
mCodeGen->mPendingRequests.RemoveAt(0);
}
}
if (request == NULL)
{
{
mCodeGen->mRequestEvent.WaitFor(20);
continue;
}
@ -318,7 +316,7 @@ void BfCodeGenThread::RunLoop()
#ifndef CODEGEN_DISABLE_CACHE
{
AutoCrit autoCrit(mCodeGen->mCacheCritSect);
AutoCrit autoCrit(mCodeGen->mCacheCritSect);
dirCache = mCodeGen->GetDirCache(cacheDir);
//For testing only!
@ -328,11 +326,11 @@ void BfCodeGenThread::RunLoop()
fileStr.Write(request->mData.mVals, request->mData.mSize);
}*/
HashContext hashCtx;
HashContext hashCtx;
hashCtx.Mixin(request->mOptions.mHash);
hashCtx.Mixin(request->mData.mVals, request->mData.mSize);
hashCtx.Mixin(request->mData.mVals, request->mData.mSize);
hash = hashCtx.Finish128();
hasCacheMatch = dirCache->CheckCache(cacheFileName, hash, &orderedHash, isLibWrite);
#ifdef BF_PLATFORM_WINDOWS
@ -346,10 +344,9 @@ void BfCodeGenThread::RunLoop()
hash = Val128();
hasCacheMatch = false;
}
}
}
#endif
}
#endif
@ -360,7 +357,7 @@ void BfCodeGenThread::RunLoop()
hasCacheMatch = false;
#endif
String errorMsg;
String errorMsg;
bool doBEProcessing = true; // TODO: Normally 'true' so we do ordered cache check for LLVM too
if (request->mOptions.mOptLevel == BfOptLevel_OgPlus)
@ -375,7 +372,7 @@ void BfCodeGenThread::RunLoop()
}
else
{
#ifdef BF_PLATFORM_WINDOWS
#ifdef BF_PLATFORM_WINDOWS
BeIRCodeGen* beIRCodeGen = new BeIRCodeGen();
defer ( delete beIRCodeGen; );
@ -383,17 +380,17 @@ void BfCodeGenThread::RunLoop()
beIRCodeGen->SetConfigConst(BfIRConfigConst_DynSlotOfs, request->mOptions.mDynSlotOfs);
if (doBEProcessing)
{
BP_ZONE("ProcessBfIRData");
{
BP_ZONE("ProcessBfIRData");
beIRCodeGen->Init(request->mData);
BeHashContext hashCtx;
hashCtx.Mixin(request->mOptions.mHash);
beIRCodeGen->Hash(hashCtx);
beIRCodeGen->Hash(hashCtx);
auto newOrderedHash = hashCtx.Finish128();
BfLogX(2, "Ordered hash for %s New:%s Old:%s\n", cacheFileName.c_str(), newOrderedHash.ToString().c_str(), orderedHash.ToString().c_str());
hasCacheMatch = newOrderedHash == orderedHash;
errorMsg = beIRCodeGen->mErrorMsg;
orderedHash = newOrderedHash;
}
@ -402,10 +399,10 @@ void BfCodeGenThread::RunLoop()
{
result.mType = BfCodeGenResult_DoneCached;
}
#ifndef CODEGEN_DISABLE_CACHE
{
AutoCrit autoCrit(mCodeGen->mCacheCritSect);
AutoCrit autoCrit(mCodeGen->mCacheCritSect);
dirCache->SetHash(cacheFileName, hash, orderedHash, !isLibWrite);
}
#endif
@ -416,7 +413,7 @@ void BfCodeGenThread::RunLoop()
//
}
else if (request->mOptions.mOptLevel == BfOptLevel_OgPlus)
{
{
#ifdef BF_PLATFORM_WINDOWS
BP_ZONE("BfCodeGen::RunLoop.Beef");
@ -432,7 +429,7 @@ void BfCodeGenThread::RunLoop()
{
if (!errorMsg.empty())
errorMsg += "\n";
errorMsg += "Failed writing IR '" + fileName + "': " + ec.message();
errorMsg += "Failed writing IR '" + fileName + "': " + ec.message();
}
else
fs.WriteSNZ(str);
@ -445,9 +442,9 @@ void BfCodeGenThread::RunLoop()
BfLogX(2, "Generating obj %s\n", request->mOutFileName.c_str());
BeCOFFObject coffObject;
coffObject.mWriteToLib = request->mOptions.mWriteToLib;
coffObject.mWriteToLib = request->mOptions.mWriteToLib;
if (!coffObject.Generate(beIRCodeGen->mBeModule, objFileName))
errorMsg = StrFormat("Failed to write object file: %s", objFileName.c_str());
errorMsg = StrFormat("Failed to write object file: %s", objFileName.c_str());
if (!beIRCodeGen->mErrorMsg.IsEmpty())
{
@ -467,14 +464,14 @@ void BfCodeGenThread::RunLoop()
BfIRCodeGen* llvmIRCodeGen = new BfIRCodeGen();
llvmIRCodeGen->SetCodeGenOptions(request->mOptions);
llvmIRCodeGen->SetConfigConst(BfIRConfigConst_VirtualMethodOfs, request->mOptions.mVirtualMethodOfs);
llvmIRCodeGen->SetConfigConst(BfIRConfigConst_DynSlotOfs, request->mOptions.mDynSlotOfs);
llvmIRCodeGen->SetConfigConst(BfIRConfigConst_DynSlotOfs, request->mOptions.mDynSlotOfs);
llvmIRCodeGen->ProcessBfIRData(request->mData);
errorMsg = llvmIRCodeGen->mErrorMsg;
llvmIRCodeGen->mErrorMsg.Clear();
if (errorMsg.IsEmpty())
{
{
if (request->mOptions.mWriteLLVMIR)
{
BP_ZONE("BfCodeGen::RunLoop.LLVM.IR");
@ -503,16 +500,16 @@ void BfCodeGenThread::RunLoop()
result.mType = BfCodeGenResult_Failed;
dirCache->FileFailed();
}
}
}
}
if (!llvmIRCodeGen->mErrorMsg.IsEmpty())
{
if (!errorMsg.IsEmpty())
errorMsg += "\n";
errorMsg += llvmIRCodeGen->mErrorMsg;
}
delete llvmIRCodeGen;
}
}
@ -538,9 +535,9 @@ void BfCodeGenThread::RunLoop()
// It's an extern request, so we own this
bool deleteRequest = false;
if (request->mExternResultPtr != NULL)
{
{
*request->mExternResultPtr = result;
deleteRequest = true;
deleteRequest = true;
}
// We need this fence for BF_USE_CODEGEN_RELEASE_THUNK usage- because we can't access the request anymore after setting
@ -549,21 +546,21 @@ void BfCodeGenThread::RunLoop()
AutoCrit autoCrit(mCodeGen->mPendingRequestCritSect);
request->mResult = result;
mCodeGen->mDoneEvent.Set();
mCodeGen->mDoneEvent.Set();
if (deleteRequest)
delete request;
}
}
}
mRunning = false;
mCodeGen->mDoneEvent.Set();
mCodeGen->mDoneEvent.Set();
}
void BfCodeGenThread::Shutdown()
{
mShuttingDown = true;
if (mRunning)
mCodeGen->mRequestEvent.Set(true);
mCodeGen->mRequestEvent.Set(true);
while (mRunning)
{
@ -580,11 +577,11 @@ static void BFP_CALLTYPE RunLoopThunk(void* codeGenThreadP)
void BfCodeGenThread::Start()
{
mRunning = true;
mRunning = true;
//TODO: How much mem do we need? WTF- we have 32MB set before!
auto mThread = BfpThread_Create(RunLoopThunk, (void*)this, 1024 * 1024, BfpThreadCreateFlag_StackSizeReserve);
BfpThread_SetPriority(mThread, BfpThreadPriority_Low, NULL);
BfpThread_Release(mThread);
BfpThread_Release(mThread);
}
//////////////////////////////////////////////////////////////////////////
@ -592,7 +589,7 @@ void BfCodeGenThread::Start()
BfCodeGen::BfCodeGen()
{
mAttemptedReleaseThunkLoad = false;
mIsUsingReleaseThunk = false;
mIsUsingReleaseThunk = false;
mReleaseModule = NULL;
mClearCacheFunc = NULL;
mGetVersionFunc = NULL;
@ -600,10 +597,10 @@ BfCodeGen::BfCodeGen()
mCancelFunc = NULL;
mFinishFunc = NULL;
mGenerateObjFunc = NULL;
mRequestIdx = 0;
#ifdef MAX_THREADS
mMaxThreadCount = MAX_THREADS;
mMaxThreadCount = MAX_THREADS;
#else
mMaxThreadCount = 6;
#endif
@ -703,7 +700,7 @@ void BfCodeGen::UpdateStats()
auto request = mRequests[0];
if (request->mResult.mType == BfCodeGenResult_NotDone)
return;
RequestComplete(request);
delete request;
mRequests.RemoveAt(0);
@ -732,7 +729,7 @@ void BfCodeGen::ClearBuildCache()
for (auto& dirCachePair : mDirectoryCache)
{
auto dirData = dirCachePair.mValue;
dirData->Clear();
dirData->Clear();
}
// This just disables reading the cache file, but it does not disable creating
// the cache structes in memory and writing them out, thus it's valid to leave
@ -747,9 +744,9 @@ void BfCodeGen::ClearBuildCache()
}
void BfCodeGen::DoWriteObjectFile(BfCodeGenRequest* codeGenRequest, const void* ptr, int size, const StringImpl& outFileName, BfCodeGenResult* externResultPtr)
{
{
codeGenRequest->mData.mVals = (uint8*)ptr;
codeGenRequest->mData.mSize = size;
codeGenRequest->mData.mSize = size;
codeGenRequest->mOutFileName = outFileName;
codeGenRequest->mResult.mType = BfCodeGenResult_NotDone;
codeGenRequest->mResult.mErrorMsgBufLen = 0;
@ -769,11 +766,11 @@ void BfCodeGen::DoWriteObjectFile(BfCodeGenRequest* codeGenRequest, const void*
auto thread = mThreads[threadIdx];
BP_ZONE("WriteObjectFile_CritSect");
AutoCrit autoCrit(mPendingRequestCritSect);
AutoCrit autoCrit(mPendingRequestCritSect);
mPendingRequests.push_back(codeGenRequest);
#ifdef BF_PLATFORM_WINDOWS
BF_ASSERT(!mRequestEvent.mEvent->mManualReset); // Make sure it's out of the SignalAll state
BF_ASSERT(!mRequestEvent.mEvent->mManualReset); // Make sure it's out of the SignalAll state
#endif
mRequestEvent.Set();
@ -843,11 +840,11 @@ bool BfCodeGen::ExternWriteObjectFile(BfCodeGenRequest* codeGenRequest)
#ifndef BF_USE_CODEGEN_RELEASE_THUNK
return false;
#endif
BindReleaseThunks();
if (!mIsUsingReleaseThunk)
return false;
return false;
mGenerateObjFunc(codeGenRequest->mData.mVals, codeGenRequest->mData.mSize, codeGenRequest->mOutFileName.c_str(), &codeGenRequest->mResult, codeGenRequest->mOptions);
@ -855,15 +852,15 @@ bool BfCodeGen::ExternWriteObjectFile(BfCodeGenRequest* codeGenRequest)
}
void BfCodeGen::WriteObjectFile(BfModule* bfModule, const StringImpl& outFileName, const BfCodeGenOptions& options)
{
{
mQueuedCount++;
BfLogSys(bfModule->mSystem, "WriteObjectFile %s\n", outFileName.c_str());
BfCodeGenRequest* codeGenRequest = new BfCodeGenRequest();
BfCodeGenRequest* codeGenRequest = new BfCodeGenRequest();
mRequests.push_back(codeGenRequest);
{
{
BP_ZONE("WriteObjectFile_GetBufferData");
bfModule->mBfIRBuilder->GetBufferData(codeGenRequest->mOutBuffer);
}
@ -873,13 +870,13 @@ void BfCodeGen::WriteObjectFile(BfModule* bfModule, const StringImpl& outFileNam
rootModule = rootModule->mParentModule;
codeGenRequest->mSrcModule = rootModule;
codeGenRequest->mOutFileName = outFileName;
codeGenRequest->mData = codeGenRequest->mOutBuffer;
codeGenRequest->mOutFileName = outFileName;
codeGenRequest->mData = codeGenRequest->mOutBuffer;
codeGenRequest->mOptions = options;
if (ExternWriteObjectFile(codeGenRequest))
return;
return;
DoWriteObjectFile(codeGenRequest, (void*)&codeGenRequest->mOutBuffer[0], (int)codeGenRequest->mOutBuffer.size(), codeGenRequest->mOutFileName, NULL);
DoWriteObjectFile(codeGenRequest, (void*)&codeGenRequest->mOutBuffer[0], (int)codeGenRequest->mOutBuffer.size(), codeGenRequest->mOutFileName, NULL);
#ifdef DBG_FORCE_SYNCHRONIZED
while (mRequests.size() != 0)
@ -918,7 +915,7 @@ void BfCodeGen::RequestComplete(BfCodeGenRequest* request)
if ((request->mResult.mType == BfCodeGenResult_Failed) || (request->mResult.mType == BfCodeGenResult_Aborted))
{
BfCodeGenErrorEntry errorEntry;
errorEntry.mSrcModule = request->mSrcModule;
errorEntry.mSrcModule = request->mSrcModule;
errorEntry.mOutFileName = request->mOutFileName;
int errorPos = 0;
@ -928,7 +925,7 @@ void BfCodeGen::RequestComplete(BfCodeGenRequest* request)
errorEntry.mErrorMessages.push_back(errorStr);
errorPos += (int)strlen(errorStr) + 1;
}
mFailedRequests.push_back(errorEntry);
}
else
@ -970,7 +967,7 @@ void BfCodeGen::ProcessErrors(BfPassInstance* passInstance, bool canceled)
{
passInstance->Fail(dirEntry->mError);
showedCacheError = true;
}
}
dirEntry->mError.clear();
}
}
@ -1000,7 +997,7 @@ void BfCodeGen::Cancel()
{
for (auto thread : mThreads)
{
thread->mShuttingDown = true;
thread->mShuttingDown = true;
}
mRequestEvent.Set(true);
@ -1016,9 +1013,9 @@ void BfCodeGen::ClearResults()
}
bool BfCodeGen::Finish()
{
{
BP_ZONE("BfCodeGen::Finish");
while (mRequests.size() != 0)
{
auto request = mRequests[0];
@ -1047,7 +1044,7 @@ bool BfCodeGen::Finish()
return false;
}
if (mIsUsingReleaseThunk)
if (mIsUsingReleaseThunk)
{
// Make the thunk release its threads (and more important, its LLVM contexts)
mFinishFunc();
@ -1056,14 +1053,14 @@ bool BfCodeGen::Finish()
// We need to shut down these threads to remove their memory
for (auto thread : mThreads)
{
thread->mShuttingDown = true;
mOldThreads.push_back(thread);
thread->mShuttingDown = true;
mOldThreads.push_back(thread);
}
mThreads.Clear();
mRequestEvent.Set(true);
ClearOldThreads(false);
// for (auto request : mPendingRequests)
// {
// if (request->mExternResultPtr != NULL)
@ -1073,7 +1070,7 @@ bool BfCodeGen::Finish()
// }
// //request->mResult.mType = BfCodeGenResult_Aborted;
// //delete request;
// }
// }
// mPendingRequests.Clear();
///
@ -1113,8 +1110,8 @@ BF_EXPORT int BF_CALLTYPE BfCodeGen_GetVersion()
BF_EXPORT void BF_CALLTYPE BfCodeGen_ClearCache()
{
GetExternCodeGen();
gExternCodeGen->ClearBuildCache();
GetExternCodeGen();
gExternCodeGen->ClearBuildCache();
}
BF_EXPORT void BF_CALLTYPE BfCodeGen_Finish()
@ -1129,7 +1126,7 @@ BF_EXPORT void BF_CALLTYPE BfCodeGen_Finish()
BF_EXPORT void BF_CALLTYPE BfCodeGen_Kill()
{
delete gExternCodeGen;
gExternCodeGen = NULL;
gExternCodeGen = NULL;
Targets_Delete();
}
@ -1140,11 +1137,10 @@ BF_EXPORT void BF_CALLTYPE BfCodeGen_Cancel()
}
BF_EXPORT void BF_CALLTYPE BfCodeGen_GenerateObj(const void* ptr, int size, const char* outFileName, BfCodeGenResult* resultPtr, const BfCodeGenOptions& options)
{
{
GetExternCodeGen();
BfCodeGenRequest* codeGenRequest = new BfCodeGenRequest();
BfCodeGenRequest* codeGenRequest = new BfCodeGenRequest();
codeGenRequest->mOptions = options;
gExternCodeGen->DoWriteObjectFile(codeGenRequest, ptr, size, outFileName, resultPtr);
}
}

View file

@ -45,16 +45,15 @@ public:
Array<String> mErrorMessages;
};
class BfCodeGenRequest
{
public:
public:
BfModule* mSrcModule;
BfCodeGenOptions mOptions;
BfCodeGenResult mResult;
Array<uint8> mOutBuffer;
BfSizedArray<uint8> mData;
String mOutFileName;
String mOutFileName;
BfCodeGenResult* mExternResultPtr;
@ -64,13 +63,13 @@ public:
mSrcModule = NULL;
mResult.mType = BfCodeGenResult_NotDone;
mResult.mErrorMsgBufLen = 0;
mExternResultPtr = NULL;
mExternResultPtr = NULL;
}
~BfCodeGenRequest()
{
{
}
void DbgSaveData();
};
@ -78,18 +77,18 @@ class BfCodeGen;
class BfCodeGenThread
{
public:
BfCodeGen* mCodeGen;
public:
BfCodeGen* mCodeGen;
int mThreadIdx;
//std::vector<BfCodeGenRequest*> mRequests;
//std::vector<BfCodeGenRequest*> mRequests;
volatile bool mShuttingDown;
volatile bool mRunning;
public:
bool RawWriteObjectFile(llvm::Module* module, const StringImpl& outFileName, const BfCodeGenOptions& codeGenOptions);
public:
public:
BfCodeGenThread();
~BfCodeGenThread();
@ -103,7 +102,7 @@ class BfCodeGenFileData
{
public:
Val128 mIRHash; // Equal when exact IR bits are equal
Val128 mIROrderedHash; // Equal when isomorphic (when alphabetically reordered functions hash equally)
Val128 mIROrderedHash; // Equal when isomorphic (when alphabetically reordered functions hash equally)
bool mLastWasObjectWrite;
};
@ -115,7 +114,7 @@ public:
Dictionary<String, String> mBuildSettings;
String mDirectoryName;
bool mDirty;
bool mVerified;
bool mVerified;
int64 mFileTime;
String mError;
bool mFileFailed;
@ -163,18 +162,18 @@ public:
typedef void (BF_CALLTYPE* FinishFunc)();
typedef void (BF_CALLTYPE* GenerateObjFunc)(const void* ptr, int size, const char* outFileName, BfCodeGenResult* resultPtr, const BfCodeGenOptions& options);
public:
public:
BfpDynLib* mReleaseModule;
bool mAttemptedReleaseThunkLoad;
bool mIsUsingReleaseThunk;
ClearCacheFunc mClearCacheFunc;
GetVersionFunc mGetVersionFunc;
KillFunc mKillFunc;
KillFunc mKillFunc;
CancelFunc mCancelFunc;
FinishFunc mFinishFunc;
GenerateObjFunc mGenerateObjFunc;
GenerateObjFunc mGenerateObjFunc;
Val128 mBackendHash;
Val128 mBackendHash;
int mMaxThreadCount;
CritSect mThreadsCritSect;
Array<BfCodeGenThread*> mThreads;
@ -184,19 +183,19 @@ public:
Deque<BfCodeGenRequest*> mPendingRequests;
SyncEvent mRequestEvent;
int mRequestIdx;
SyncEvent mDoneEvent;
SyncEvent mDoneEvent;
int mQueuedCount;
int mCompletionCount;
int mCompletionCount;
Array<BfCodeGenErrorEntry> mFailedRequests;
Array<BfCodeGenFileEntry> mCodeGenFiles;
CritSect mCacheCritSect;
bool mDisableCacheReads;
Dictionary<String, BfCodeGenDirectoryData*> mDirectoryCache;
public:
public:
void SetMaxThreads(int maxThreads);
void BindReleaseThunks();
void ClearResults();
@ -208,13 +207,13 @@ public:
void ProcessErrors(BfPassInstance* passInstance, bool canceled);
BfCodeGenDirectoryData* GetDirCache(const StringImpl& cacheDir);
public:
public:
BfCodeGen();
~BfCodeGen();
void ResetStats();
void UpdateStats();
void WriteObjectFile(BfModule* module, const StringImpl& outFileName, const BfCodeGenOptions& options);
void WriteObjectFile(BfModule* module, const StringImpl& outFileName, const BfCodeGenOptions& options);
String GetBuildValue(const StringImpl& buildDir, const StringImpl& key);
void SetBuildValue(const StringImpl& buildDir, const StringImpl& key, const StringImpl& value);
void WriteBuildCache(const StringImpl& buildDir);

File diff suppressed because it is too large Load diff

View file

@ -50,7 +50,7 @@ enum BfCompileOnDemandKind
BfCompileOnDemandKind_SkipUnused
};
class BfCompiler
class BfCompiler
{
public:
enum CompileState
@ -63,22 +63,22 @@ public:
};
struct Stats
{
{
int mTotalTypes;
int mMethodDeclarations;
int mTypesPopulated;
int mMethodsProcessed;
int mUnreifiedMethodsProcessed;
int mUnreifiedMethodsProcessed;
int mQueuedTypesProcessed;
int mTypesQueued;
int mTypesDeleted;
int mMethodsQueued;
int mMethodsQueued;
int mModulesStarted;
int mModulesFinished;
int mModulesReified;
int mModulesUnreified;
@ -94,19 +94,19 @@ public:
{
BfProject* mHotProject;
int mHotCompileIdx;
int32 mForceRebuildIdx;
BfCompileOnDemandKind mCompileOnDemandKind;
BfCompileOnDemandKind mCompileOnDemandKind;
String mTargetTriple;
String mTargetCPU;
BfPlatformType mPlatformType;
BfMachineType mMachineType;
int mCLongSize;
BfToolsetType mToolsetType;
BfSIMDSetting mSIMDSetting;
BfSIMDSetting mSIMDSetting;
String mMallocLinkName;
String mFreeLinkName;
bool mIncrementalBuild;
bool mIncrementalBuild;
bool mEmitDebugInfo;
bool mEmitLineInfo;
@ -116,15 +116,15 @@ public:
bool mRuntimeChecks;
bool mAllowStructByVal;
bool mEmitDynamicCastCheck;
bool mAllowHotSwapping;
bool mObjectHasDebugFlags;
bool mObjectHasDebugFlags;
bool mEnableRealtimeLeakCheck;
bool mEmitObjectAccessCheck; // Only valid with mObjectHasDebugFlags
bool mArithmeticChecks;
bool mEnableCustodian;
bool mEnableSideStack;
bool mHasVDataExtender;
bool mHasVDataExtender;
bool mDebugAlloc;
bool mOmitDebugHelpers;
@ -167,7 +167,7 @@ public:
mAllowHotSwapping = false;
mEmitObjectAccessCheck = false;
mArithmeticChecks = false;
mObjectHasDebugFlags = false;
mObjectHasDebugFlags = false;
mEnableRealtimeLeakCheck = false;
mWriteIR = false;
mGenerateObj = true;
@ -195,19 +195,19 @@ public:
}
};
Options mOptions;
enum HotTypeFlags
{
HotTypeFlag_None = 0,
HotTypeFlag_UserNotUsed = 1,
HotTypeFlag_UserUsed = 2,
HotTypeFlag_UserUsed = 2,
HotTypeFlag_Heap = 4,
HotTypeFlag_ActiveFunction = 8, // Only set for a type version mismatch
HotTypeFlag_Delegate = 0x10, // Only set for a type version mismatch
HotTypeFlag_FuncPtr = 0x20, // Only set for a type version mismatch
HotTypeFlag_CanAllocate = 0x40
};
};
enum HotResolveFlags
{
@ -237,7 +237,7 @@ public:
Array<HotTypeFlags> mHotTypeIdFlags;
Array<BfHotDepData*> mReasons;
HashSet<BfHotMethod*> mDeferredThisCheckMethods;
~HotResolveData();
};
@ -261,7 +261,7 @@ public:
BfHotThisType* GetThisType(BfHotTypeVersion* hotVersion);
BfHotAllocation* GetAllocation(BfHotTypeVersion* hotVersion);
BfHotDevirtualizedMethod* GetDevirtualizedMethod(BfHotMethod* hotMethod);
BfHotFunctionReference* GetFunctionReference(BfHotMethod* hotMethod);
BfHotFunctionReference* GetFunctionReference(BfHotMethod* hotMethod);
BfHotVirtualDeclaration* GetVirtualDeclaration(BfHotMethod* hotMethod);
BfHotInnerMethod* GetInnerMethod(BfHotMethod* hotMethod);
};
@ -270,10 +270,10 @@ public:
{
public:
BfProject* mHotProject;
int mLastStringId;
int mLastStringId;
int mCommittedHotCompileIdx;
bool mHasNewTypes;
bool mHasNewInterfaceTypes;
bool mHasNewInterfaceTypes;
Array<BfCodeGenFileEntry> mQueuedOutFiles; // Queues up when we have failed hot compiles
HashSet<int> mSlotDefineTypeIds;
HashSet<int> mNewlySlottedTypeIds;
@ -284,7 +284,7 @@ public:
public:
HotState()
{
{
mHotProject = NULL;
mLastStringId = -1;
mCommittedHotCompileIdx = 0;
@ -298,28 +298,28 @@ public:
void RemovePendingChanges(BfTypeInstance* type);
};
HotData* mHotData;
HotState* mHotState;
HotState* mHotState;
HotResolveData* mHotResolveData;
struct StringValueEntry
{
int mId;
BfIRValue mStringVal;
};
};
struct TestMethod
{
String mName;
BfMethodInstance* mMethodInstance;
};
};
public:
BfPassInstance* mPassInstance;
public:
BfPassInstance* mPassInstance;
FILE* mCompileLogFP;
CeMachine* mCeMachine;
int mCurCEExecuteId;
BfSystem* mSystem;
BfSystem* mSystem;
bool mIsResolveOnly;
BfResolvePassData* mResolvePassData;
Dictionary<String, Array<int>> mAttributeTypeOptionMap;
@ -343,13 +343,13 @@ public:
bool mDepsMayHaveDeletedTypes;
float mCompletionPct;
int mHSPreserveIdx;
BfModule* mLastAutocompleteModule;
BfModule* mLastAutocompleteModule;
CompileState mCompileState;
HashSet<String> mRebuildFileSet;
HashSet<String> mRebuildChangedFileSet; // Files we had actual changes from
Array<BfVDataModule*> mVDataModules;
Array<BfVDataModule*> mVDataModules;
BfTypeDef* mBfObjectTypeDef;
BfTypeDef* mChar32TypeDef;
BfTypeDef* mFloatTypeDef;
@ -360,16 +360,16 @@ public:
BfTypeDef* mArray2TypeDef;
BfTypeDef* mArray3TypeDef;
BfTypeDef* mArray4TypeDef;
BfTypeDef* mSpanTypeDef;
BfTypeDef* mSpanTypeDef;
BfTypeDef* mRangeTypeDef;
BfTypeDef* mClosedRangeTypeDef;
BfTypeDef* mIndexTypeDef;
BfTypeDef* mIndexRangeTypeDef;
BfTypeDef* mClassVDataTypeDef;
BfTypeDef* mClassVDataTypeDef;
BfTypeDef* mDbgRawAllocDataTypeDef;
BfTypeDef* mDeferredCallTypeDef;
BfTypeDef* mDeferredCallTypeDef;
BfTypeDef* mDelegateTypeDef;
BfTypeDef* mFunctionTypeDef;
BfTypeDef* mActionTypeDef;
@ -377,13 +377,13 @@ public:
BfTypeDef* mStringTypeDef;
BfTypeDef* mStringViewTypeDef;
BfTypeDef* mTypeTypeDef;
BfTypeDef* mValueTypeTypeDef;
BfTypeDef* mResultTypeDef;
BfTypeDef* mGCTypeDef;
BfTypeDef* mValueTypeTypeDef;
BfTypeDef* mResultTypeDef;
BfTypeDef* mGCTypeDef;
BfTypeDef* mGenericIEnumerableTypeDef;
BfTypeDef* mGenericIEnumeratorTypeDef;
BfTypeDef* mGenericIRefEnumeratorTypeDef;
BfTypeDef* mThreadTypeDef;
BfTypeDef* mInternalTypeDef;
BfTypeDef* mPlatformTypeDef;
@ -395,15 +395,15 @@ public:
BfTypeDef* mIPrintableTypeDef;
BfTypeDef* mIHashableTypeDef;
BfTypeDef* mIComptimeTypeApply;
BfTypeDef* mIComptimeMethodApply;
BfTypeDef* mIComptimeMethodApply;
BfTypeDef* mIOnTypeInitTypeDef;
BfTypeDef* mIOnTypeDoneTypeDef;
BfTypeDef* mIOnFieldInitTypeDef;
BfTypeDef* mIOnMethodInitTypeDef;
BfTypeDef* mMethodRefTypeDef;
BfTypeDef* mNullableTypeDef;
BfTypeDef* mPointerTTypeDef;
BfTypeDef* mPointerTypeDef;
BfTypeDef* mReflectTypeIdTypeDef;
@ -420,17 +420,17 @@ public:
BfTypeDef* mReflectConstExprType;
BfTypeDef* mReflectSpecializedGenericType;
BfTypeDef* mReflectTypeInstanceTypeDef;
BfTypeDef* mReflectUnspecializedGenericType;
BfTypeDef* mReflectUnspecializedGenericType;
BfTypeDef* mReflectFieldInfoTypeDef;
BfTypeDef* mReflectMethodInfoTypeDef;
BfTypeDef* mSizedArrayTypeDef;
BfTypeDef* mAttributeTypeDef;
BfTypeDef* mAttributeUsageAttributeTypeDef;
BfTypeDef* mLinkNameAttributeTypeDef;
BfTypeDef* mCallingConventionAttributeTypeDef;
BfTypeDef* mOrderedAttributeTypeDef;
BfTypeDef* mInlineAttributeTypeDef;
BfTypeDef* mOrderedAttributeTypeDef;
BfTypeDef* mInlineAttributeTypeDef;
BfTypeDef* mCLinkAttributeTypeDef;
BfTypeDef* mImportAttributeTypeDef;
BfTypeDef* mExportAttributeTypeDef;
@ -446,30 +446,30 @@ public:
BfTypeDef* mConstEvalAttributeTypeDef;
BfTypeDef* mNoExtensionAttributeTypeDef;
BfTypeDef* mCheckedAttributeTypeDef;
BfTypeDef* mUncheckedAttributeTypeDef;
BfTypeDef* mUncheckedAttributeTypeDef;
BfTypeDef* mStaticInitAfterAttributeTypeDef;
BfTypeDef* mStaticInitPriorityAttributeTypeDef;
BfTypeDef* mStaticInitPriorityAttributeTypeDef;
BfTypeDef* mTestAttributeTypeDef;
BfTypeDef* mThreadStaticAttributeTypeDef;
BfTypeDef* mThreadStaticAttributeTypeDef;
BfTypeDef* mUnboundAttributeTypeDef;
BfTypeDef* mObsoleteAttributeTypeDef;
BfTypeDef* mErrorAttributeTypeDef;
BfTypeDef* mWarnAttributeTypeDef;
BfTypeDef* mConstSkipAttributeTypeDef;
BfTypeDef* mIgnoreErrorsAttributeTypeDef;
BfTypeDef* mReflectAttributeTypeDef;
BfTypeDef* mReflectAttributeTypeDef;
BfTypeDef* mOnCompileAttributeTypeDef;
int mCurTypeId;
int mCurTypeId;
int mTypeInitCount;
String mOutputPath;
Array<BfType*> mGenericInstancePurgatory;
Array<BfType*> mGenericInstancePurgatory;
Array<int> mTypeIdFreeList;
int mMaxInterfaceSlots;
bool mInterfaceSlotCountChanged;
public:
public:
bool IsTypeAccessible(BfType* checkType, BfProject* curProject);
bool IsTypeUsed(BfType* checkType, BfProject* curProject);
bool IsModuleAccessible(BfModule* module, BfProject* curProject);
@ -479,22 +479,22 @@ public:
BfIRFunction CreateLoadSharedLibraries(BfVDataModule* bfModule, Array<BfMethodInstance*>& dllMethods);
void GetTestMethods(BfVDataModule* bfModule, Array<TestMethod>& testMethods, HashContext& vdataHashCtx);
void EmitTestMethod(BfVDataModule* bfModule, Array<TestMethod>& testMethods, BfIRValue& retValue);
void CreateVData(BfVDataModule* bfModule);
void CreateVData(BfVDataModule* bfModule);
void UpdateDependencyMap(bool deleteUnusued, bool& didWork);
void SanitizeDependencyMap();
bool ProcessPurgatory(bool reifiedOnly);
bool VerifySlotNums();
bool QuickGenerateSlotNums();
bool SlowGenerateSlotNums();
void GenerateSlotNums();
void GenerateSlotNums();
void GenerateDynCastData();
void UpdateRevisedTypes();
void VisitAutocompleteExteriorIdentifiers();
void VisitAutocompleteExteriorIdentifiers();
void VisitSourceExteriorNodes();
void UpdateCompletion();
bool DoWorkLoop(bool onlyReifiedTypes = false, bool onlyReifiedMethods = false);
BfMangler::MangleKind GetMangleKind();
BfTypeDef* GetArrayTypeDef(int dimensions);
void GenerateAutocompleteInfo();
void MarkStringPool(BfModule* module);
@ -517,7 +517,7 @@ public:
bool IsCePaused();
bool EnsureCeUnpaused(BfType* refType);
void HotCommit();
void HotCommit();
void HotResolve_Start(HotResolveFlags flags);
void HotResolve_PopulateMethodNameMap();
bool HotResolve_AddReachableMethod(BfHotMethod* hotMethod, HotTypeFlags flags, bool devirtualized, bool forceProcess = false);
@ -532,24 +532,24 @@ public:
public:
BfCompiler(BfSystem* bfSystem, bool isResolveOnly);
~BfCompiler();
~BfCompiler();
bool Compile(const StringImpl& outputPath);
bool Compile(const StringImpl& outputPath);
bool DoCompile(const StringImpl& outputPath);
void ClearResults();
void ProcessAutocompleteTempType();
void GetSymbolReferences();
void ProcessAutocompleteTempType();
void GetSymbolReferences();
void Cancel();
void RequestFastFinish();
void RequestFastFinish();
String GetTypeDefList();
String GetGeneratorString(BfTypeDef* typeDef, BfTypeInstance* typeInst, const StringImpl& generatorMethodName, const StringImpl* args);
void HandleGeneratorErrors(StringImpl& result);
String GetGeneratorTypeDefList();
String GetGeneratorInitData(const StringImpl& typeName, const StringImpl& args);
String GetGeneratorGenData(const StringImpl& typeName, const StringImpl& args);
String GetTypeDefMatches(const StringImpl& searchSrc);
String GetTypeDefMatches(const StringImpl& searchSrc);
void GetTypeDefs(const StringImpl& typeName, Array<BfTypeDef*>& typeDefs);
String GetTypeDefInfo(const StringImpl& typeName);
String GetTypeDefInfo(const StringImpl& typeName);
int GetTypeId(const StringImpl& typeName);
BfType* GetType(const StringImpl& typeName);
int GetEmitSource(const StringImpl& fileName, StringImpl* outBuffer);
@ -561,4 +561,3 @@ public:
};
NS_BF_END

View file

@ -64,25 +64,25 @@ BfTypedValue BfConstResolver::Resolve(BfExpression* expr, BfType* wantType, BfCo
// Dot-initialized
if (memberRefExpr->mTarget == NULL)
arraySize = (int)invocationExpr->mArguments.size();
}
}
else if (auto indexerExpr = BfNodeDynCast<BfIndexerExpression>(invocationExpr->mTarget))
{
if (indexerExpr->mArguments.size() == 0)
{
// Inferred-type sized array initializer
arraySize = (int)invocationExpr->mArguments.size();
}
}
}
}
}
if (arraySize != -1)
{
{
mResult = BfTypedValue(mModule->GetConstValue(arraySize), mModule->GetPrimitiveType(BfTypeCode_IntPtr));
return mResult;
}
else
{
{
mResult = BfTypedValue(mModule->mBfIRBuilder->GetUndefConstValue(mModule->mBfIRBuilder->GetPrimitiveType(BfTypeCode_IntPtr)), mModule->GetPrimitiveType(BfTypeCode_IntPtr));
return mResult;
}
@ -103,16 +103,16 @@ BfTypedValue BfConstResolver::Resolve(BfExpression* expr, BfType* wantType, BfCo
}
SetAndRestoreValue<bool> prevIgnoreWrites(mModule->mBfIRBuilder->mIgnoreWrites, wantIgnoreWrites);
auto prevInsertBlock = mModule->mBfIRBuilder->GetInsertBlock();
mNoBind = true;
if (wantType != NULL)
mExpectingType = wantType;
VisitChildNoRef(expr);
mResult = GetResult();
auto compilerVal = mModule->GetCompilerFieldValue(mResult);
if (compilerVal)
mResult = compilerVal;
@ -131,14 +131,14 @@ BfTypedValue BfConstResolver::Resolve(BfExpression* expr, BfType* wantType, BfCo
(toType == mResult.mType)))
{
auto constant = mModule->mBfIRBuilder->GetConstant(mResult.mValue);
if (constant->mTypeCode == BfTypeCode_NullPtr)
{
return mModule->GetDefaultTypedValue(toType);
}
else
{
int stringId = mModule->GetStringPoolIdx(mResult.mValue);
int stringId = mModule->GetStringPoolIdx(mResult.mValue);
if (stringId != -1)
{
if ((flags & BfConstResolveFlag_ActualizeValues) != 0)
@ -166,9 +166,9 @@ BfTypedValue BfConstResolver::Resolve(BfExpression* expr, BfType* wantType, BfCo
mResult = convValue;
}
else
{
{
mResult = mModule->Cast(expr, mResult, wantType, (BfCastFlags)(BfCastFlags_NoConversionOperator | (explicitCast ? BfCastFlags_Explicit : BfCastFlags_None)));
}
}
}
if (mResult.mKind == BfTypedValueKind_GenericConstValue)
@ -195,9 +195,9 @@ BfTypedValue BfConstResolver::Resolve(BfExpression* expr, BfType* wantType, BfCo
isConst = false;
}
}
if ((!isConst) && ((mBfEvalExprFlags & BfEvalExprFlags_AllowNonConst) == 0))
{
{
mModule->Fail("Expression does not evaluate to a constant value", expr);
if (wantType != NULL)
@ -210,7 +210,7 @@ BfTypedValue BfConstResolver::Resolve(BfExpression* expr, BfType* wantType, BfCo
{
if (wantType != NULL)
mResult = mModule->GetDefaultTypedValue(wantType);
}
}
if (prevInsertBlock)
mModule->mBfIRBuilder->SetInsertPoint(prevInsertBlock);
@ -221,7 +221,7 @@ BfTypedValue BfConstResolver::Resolve(BfExpression* expr, BfType* wantType, BfCo
mModule->mBfIRBuilder->SetInsertPoint(prevInsertBlock);
}*/
mModule->FixIntUnknown(mResult);
mModule->FixIntUnknown(mResult);
if ((flags & BfConstResolveFlag_NoActualizeValues) == 0)
{
@ -240,10 +240,10 @@ bool BfConstResolver::PrepareMethodArguments(BfAstNode* targetSrc, BfMethodMatch
int extendedParamIdx = 0;
SetAndRestoreValue<bool> ignoreWrites(mModule->mBfIRBuilder->mIgnoreWrites, true);
llvm::SmallVector<BfIRValue, 4> expandedParamsConstValues;
BfType* expandedParamsElementType = NULL;
// We don't do GetMethodInstance in mModule, because our module may not have init finished yet
//auto targetModule = methodMatcher->mBestMethodTypeInstance->mModule;
auto targetModule = mModule->mContext->mUnreifiedModule;
@ -260,7 +260,7 @@ bool BfConstResolver::PrepareMethodArguments(BfAstNode* targetSrc, BfMethodMatch
auto& arguments = methodMatcher->mArguments;
mModule->AddDependency(methodInstance->mReturnType, mModule->mCurTypeInstance, BfDependencyMap::DependencyFlag_LocalUsage);
for (int paramIdx = 0; paramIdx < methodInstance->GetParamCount(); paramIdx++)
for (int paramIdx = 0; paramIdx < methodInstance->GetParamCount(); paramIdx++)
{
auto paramType = methodInstance->GetParamType(paramIdx);
mModule->AddDependency(paramType, mModule->mCurTypeInstance, BfDependencyMap::DependencyFlag_LocalUsage);
@ -271,7 +271,7 @@ bool BfConstResolver::PrepareMethodArguments(BfAstNode* targetSrc, BfMethodMatch
if (paramIdx >= (int)methodInstance->GetParamCount())
{
if (argIdx < (int)arguments.size())
{
{
BfAstNode* errorRef = arguments[methodInstance->GetParamCount()].mExpression;
if (errorRef->GetSourceData() == NULL)
errorRef = targetSrc;
@ -281,7 +281,7 @@ bool BfConstResolver::PrepareMethodArguments(BfAstNode* targetSrc, BfMethodMatch
return false;
}
break;
}
}
BfType* wantType = NULL;
if (expandedParamsElementType != NULL)
@ -351,7 +351,7 @@ bool BfConstResolver::PrepareMethodArguments(BfAstNode* targetSrc, BfMethodMatch
if (attributeDirective->mCtorCloseParen != NULL)
refNode = attributeDirective->mCtorCloseParen;
}
}
}
auto autoComplete = GetAutoComplete();
if (autoComplete != NULL)
@ -361,14 +361,14 @@ bool BfConstResolver::PrepareMethodArguments(BfAstNode* targetSrc, BfMethodMatch
autoComplete->CheckEmptyStart(prevNode, wantType);
}
}
if (mModule->PreFail())
mModule->Fail(StrFormat("Not enough parameters specified. Expected %d more.", methodInstance->GetParamCount() - (int)arguments.size()), refNode);
return false;
}
auto foreignDefaultVal = methodInstance->mDefaultValues[argIdx];
auto foreignConst = methodInstance->GetOwner()->mConstHolder->GetConstant(foreignDefaultVal.mValue);
auto foreignConst = methodInstance->GetOwner()->mConstHolder->GetConstant(foreignDefaultVal.mValue);
argValue = mModule->GetTypedValueFromConstant(foreignConst, methodInstance->GetOwner()->mConstHolder, foreignDefaultVal.mType);
}
@ -387,7 +387,7 @@ bool BfConstResolver::PrepareMethodArguments(BfAstNode* targetSrc, BfMethodMatch
arg.mArgFlags = BfArgFlag_None;
}
}
if (!argValue)
return BfTypedValue();
@ -410,14 +410,14 @@ bool BfConstResolver::PrepareMethodArguments(BfAstNode* targetSrc, BfMethodMatch
extendedParamIdx++;
}
else
{
{
bool requiresConst = false;
if ((mModule->mCurMethodInstance == NULL) || (mModule->mCurMethodInstance->mMethodDef->mMethodType != BfMethodType_Mixin))
requiresConst = true;
if ((requiresConst) && (argValue.mValue.IsFake()) && (!argValue.mType->IsValuelessType()))
{
mModule->Fail("Expression does not evaluate to a constant value", argExpr);
{
mModule->Fail("Expression does not evaluate to a constant value", argExpr);
}
if (!argValue.mType->IsVar())
@ -433,11 +433,11 @@ bool BfConstResolver::PrepareMethodArguments(BfAstNode* targetSrc, BfMethodMatch
}
if (expandedParamsElementType != NULL)
{
{
auto arrayType = mModule->mBfIRBuilder->GetSizedArrayType(mModule->mBfIRBuilder->MapType(expandedParamsElementType), (int)expandedParamsConstValues.size());
auto constArray = mModule->mBfIRBuilder->CreateConstAgg(arrayType, expandedParamsConstValues);
llvmArgs.push_back(constArray);
}
}
return true;
}

View file

@ -24,13 +24,13 @@ enum BfConstResolveFlags
class BfConstResolver : public BfExprEvaluator
{
public:
bool mIsInvalidConstExpr;
bool mIsInvalidConstExpr;
public:
virtual bool CheckAllowValue(const BfTypedValue& typedValue, BfAstNode* refNode) override;
public:
BfConstResolver(BfModule* bfModule);
BfConstResolver(BfModule* bfModule);
BfTypedValue Resolve(BfExpression* expr, BfType* wantType = NULL, BfConstResolveFlags flags = BfConstResolveFlag_None);
bool PrepareMethodArguments(BfAstNode* targetSrc, BfMethodMatcher* methodMatcher, Array<BfIRValue>& llvmArgs);

File diff suppressed because it is too large Load diff

View file

@ -12,22 +12,22 @@ public:
BfModule* mFromModule;
int mRevision;
int mSignatureRevision;
int mFromModuleRevision;
int mFromModuleRevision;
int mFromModuleRebuildIdx;
int mReqId;
static int sCurReqId;
int mReqId;
static int sCurReqId;
public:
BfWorkListEntry()
{
mType = NULL;
mFromModule = NULL;
mRevision = -1;
mRevision = -1;
mSignatureRevision = -1;
mFromModuleRevision = -1;
mFromModuleRebuildIdx = -1;
mReqId = ++sCurReqId;
}
mReqId = ++sCurReqId;
}
};
class BfTypeProcessRequest : public BfWorkListEntry
@ -43,7 +43,7 @@ public:
class BfMethodSpecializationRequest : public BfWorkListEntry
{
public:
public:
int32 mMethodIdx;
BfTypeVector mMethodGenericArguments;
BfGetMethodInstanceFlags mFlags;
@ -51,7 +51,7 @@ public:
public:
BfMethodSpecializationRequest()
{
{
mMethodIdx = -1;
mFlags = BfGetMethodInstanceFlag_None;
mForeignType = NULL;
@ -97,9 +97,9 @@ public:
class BfInlineMethodRequest : public BfMethodProcessRequest
{
public:
public:
BfIRFunction mFunc;
~BfInlineMethodRequest()
{
mMethodInstance = NULL;
@ -110,12 +110,12 @@ class BfTypeRefVerifyRequest : public BfWorkListEntry
{
public:
BfTypeInstance* mCurTypeInstance;
BfAstNode* mRefNode;
BfAstNode* mRefNode;
};
class BfMidCompileRequest : public BfWorkListEntry
{
public:
public:
String mReason;
};
@ -153,15 +153,15 @@ public:
BfType* mType;
BfTypeDef* mGlobalContainerCurUserTypeDef;
Array<BfGlobalContainerEntry> mGlobalContainers; // All global containers that are visible
Array<BfGlobalContainerEntry> mGlobalContainers; // All global containers that are visible
BfPopulateType mPopulateType;
BfTypeReference* mCurBaseTypeRef;
BfTypeInstance* mCurBaseType;
BfTypeReference* mCurAttributeTypeRef;
BfFieldDef* mCurFieldDef;
BfFieldDef* mCurFieldDef;
BfTypeDef* mCurTypeDef;
BfTypeDef* mForceActiveTypeDef;
BfTypeDef* mForceActiveTypeDef;
BfProject* mActiveProject;
ResolveKind mResolveKind;
BfAstNode* mCurVarInitializer;
@ -209,7 +209,7 @@ public:
class BfSavedTypeData
{
public:
BfHotTypeData* mHotTypeData;
BfHotTypeData* mHotTypeData;
int mTypeId;
public:
@ -221,7 +221,7 @@ public:
struct SpecializedErrorData
{
// We need to store errors during type specialization and method specialization,
// We need to store errors during type specialization and method specialization,
// because if the type is deleted we need to clear the errors
BfTypeInstance* mRefType;
BfModule* mModule;
@ -241,8 +241,8 @@ struct BfCaseInsensitiveStringHash
{
size_t operator()(const StringImpl& str) const
{
int curHash = 0;
for (int i = 0; i < (int)str.length(); i++)
int curHash = 0;
for (int i = 0; i < (int)str.length(); i++)
curHash = ((curHash ^ (int)(intptr)toupper(str[i])) << 5) - curHash;
return curHash;
}
@ -251,7 +251,7 @@ struct BfCaseInsensitiveStringHash
struct BfCaseInsensitiveStringEquals
{
bool operator()(const StringImpl& lhs, const StringImpl& rhs) const
{
{
if (lhs.length() != rhs.length())
return false;
return _stricmp(lhs.c_str(), rhs.c_str()) == 0;
@ -270,7 +270,7 @@ public:
{
T*& ref = (*this)[idx];
if (ref != NULL)
(*ref).~T();
(*ref).~T();
Deque<T*>::RemoveAt(0);
if (this->mSize == 0)
{
@ -303,7 +303,7 @@ public:
T* item = mWorkAlloc.Alloc<T>();
this->Add(item);
return item;
}
}
};
template <typename T>
@ -348,7 +348,7 @@ public:
bool operator==(const BfConstraintState& other) const
{
return
return
(mGenericParamInstance == other.mGenericParamInstance) &&
(mLeftType == other.mLeftType) &&
(mRightType == other.mRightType);
@ -358,9 +358,9 @@ public:
class BfContext
{
public:
CritSect mCritSect;
bool mDeleting;
CritSect mCritSect;
bool mDeleting;
BfTypeState* mCurTypeState;
BfSizedArray<BfNamespaceDeclaration*>* mCurNamespaceNodes;
BfConstraintState* mCurConstraintState;
@ -369,25 +369,25 @@ public:
bool mAssertOnPopulateType;
BfSystem* mSystem;
BfCompiler* mCompiler;
BfCompiler* mCompiler;
bool mAllowLockYield;
bool mLockModules;
BfModule* mScratchModule;
BfModule* mUnreifiedModule;
BfModule* mUnreifiedModule;
HashSet<String> mUsedModuleNames;
Dictionary<BfProject*, BfModule*> mProjectModule;
Array<BfModule*> mModules;
Array<BfModule*> mDeletingModules;
HashSet<BfTypeInstance*> mFailTypes; // All types handled after a failure need to be rebuild on subsequent compile
Array<BfModule*> mDeletingModules;
HashSet<BfTypeInstance*> mFailTypes; // All types handled after a failure need to be rebuild on subsequent compile
HashSet<BfTypeInstance*> mReferencedIFaceSlots;
BfMethodInstance* mValueTypeDeinitSentinel;
Array<BfAstNode*> mTempNodes;
BfResolvedTypeSet mResolvedTypes;
BfResolvedTypeSet mResolvedTypes;
Array<BfType*> mTypes; // Can contain NULLs for deleted types
Array<BfFieldInstance*> mFieldResolveReentrys; // For detecting 'var' field circular refs
Array<BfFieldInstance*> mFieldResolveReentrys; // For detecting 'var' field circular refs
Dictionary<String, BfSavedTypeData*> mSavedTypeDataMap;
Array<BfSavedTypeData*> mSavedTypeData;
@ -399,7 +399,7 @@ public:
PtrWorkQueue<BfModule*> mReifyModuleWorkList;
WorkQueue<BfMethodProcessRequest> mMethodWorkList;
WorkQueue<BfInlineMethodRequest> mInlineMethodWorkList;
WorkQueue<BfInlineMethodRequest> mInlineMethodWorkList;
WorkQueue<BfTypeProcessRequest> mPopulateTypeWorkList;
WorkQueue<BfMethodSpecializationRequest> mMethodSpecializationWorkList;
WorkQueue<BfTypeRefVerifyRequest> mTypeRefVerifyWorkList;
@ -409,7 +409,7 @@ public:
bool mHasReifiedQueuedRebuildTypes;
Array<BfGenericParamType*> mGenericParamTypes[3];
Array<BfType*> mTypeGraveyard;
Array<BfTypeDef*> mTypeDefGraveyard;
Array<BfLocalMethod*> mLocalMethodGraveyard;
@ -418,9 +418,9 @@ public:
Dictionary<int, BfStringPoolEntry> mStringObjectIdMap;
int mCurStringObjectPoolId;
HashSet<BfTypeInstance*> mQueuedSpecializedMethodRebuildTypes;
HashSet<BfTypeInstance*> mQueuedSpecializedMethodRebuildTypes;
BfAllocPool<BfPointerType> mPointerTypePool;
BfAllocPool<BfPointerType> mPointerTypePool;
BfAllocPool<BfArrayType> mArrayTypePool;
BfAllocPool<BfSizedArrayType> mSizedArrayTypePool;
BfAllocPool<BfUnknownSizedArrayType> mUnknownSizedArrayTypePool;
@ -429,13 +429,13 @@ public:
BfAllocPool<BfTypeAliasType> mAliasTypePool;
BfAllocPool<BfRefType> mRefTypePool;
BfAllocPool<BfModifiedTypeType> mModifiedTypeTypePool;
BfAllocPool<BfTypeInstance> mGenericTypeInstancePool;
BfAllocPool<BfTypeInstance> mGenericTypeInstancePool;
BfAllocPool<BfArrayType> mArrayTypeInstancePool;
BfAllocPool<BfGenericParamType> mGenericParamTypePool;
BfAllocPool<BfDirectTypeDefReference> mTypeDefTypeRefPool;
BfAllocPool<BfConcreteInterfaceType> mConcreteInterfaceTypePool;
BfAllocPool<BfConstExprValueType> mConstExprValueTypePool;
BfAllocPool<BfDelegateType> mDelegateTypePool;
BfAllocPool<BfDelegateType> mDelegateTypePool;
BfPrimitiveType* mPrimitiveTypes[BfTypeCode_Length];
BfPrimitiveType* mPrimitiveStructTypes[BfTypeCode_Length];
@ -447,15 +447,15 @@ public:
void PopulateHotTypeDataVTable(BfTypeInstance* typeInstance);
void DeleteType(BfType* type, bool deferDepRebuilds = false);
void UpdateAfterDeletingTypes();
void VerifyTypeLookups(BfTypeInstance* typeInst);
void VerifyTypeLookups(BfTypeInstance* typeInst);
void GenerateModuleName_TypeInst(BfTypeInstance* typeInst, StringImpl& name);
void GenerateModuleName_Type(BfType* type, StringImpl& name);
void GenerateModuleName(BfTypeInstance* typeInst, StringImpl& name);
bool IsSentinelMethod(BfMethodInstance* methodInstance);
void SaveDeletingType(BfType* type);
void SaveDeletingType(BfType* type);
BfType* FindType(const StringImpl& typeName);
String TypeIdToString(int typeId);
BfHotTypeData* GetHotTypeData(int typeId);
BfHotTypeData* GetHotTypeData(int typeId);
void ReflectInit();
public:
@ -464,28 +464,28 @@ public:
void ReportMemory(MemReporter* memReporter);
void ProcessMethod(BfMethodInstance* methodInstance);
int GetStringLiteralId(const StringImpl& str);
int GetStringLiteralId(const StringImpl& str);
void CheckLockYield();
bool IsCancellingAndYield();
void QueueFinishModule(BfModule * module);
void CancelWorkItems();
bool ProcessWorkList(bool onlyReifiedTypes, bool onlyReifiedMethods);
void HandleChangedTypeDef(BfTypeDef* typeDef, bool isAutoCompleteTempType = false);
void PreUpdateRevisedTypes();
void UpdateRevisedTypes();
void VerifyTypeLookups();
void PreUpdateRevisedTypes();
void UpdateRevisedTypes();
void VerifyTypeLookups();
void QueueMethodSpecializations(BfTypeInstance* typeInst, bool checkSpecializedMethodRebuildFlag);
void MarkAsReferenced(BfDependedType* depType);
void RemoveInvalidFailTypes();
bool IsWorkItemValid(BfWorkListEntry* item);
bool IsWorkItemValid(BfMethodProcessRequest* item);
bool IsWorkItemValid(BfMethodSpecializationRequest* item);
void RemoveInvalidWorkItems();
void RemoveInvalidWorkItems();
BfType* FindTypeById(int typeId);
void AddTypeToWorkList(BfType* type);
void ValidateDependencies();
void RebuildType(BfType* type, bool deleteOnDemandTypes = true, bool rebuildModule = true, bool placeSpecializiedInPurgatory = true);
void RebuildDependentTypes(BfDependedType* dType);
void RebuildDependentTypes(BfDependedType* dType);
void QueueMidCompileRebuildDependentTypes(BfDependedType* dType, const String& reason);
void RebuildDependentTypes_MidCompile(BfDependedType* dType, const String& reason);
bool CanRebuild(BfType* type);

File diff suppressed because it is too large Load diff

View file

@ -39,14 +39,14 @@ public:
Array<BfTypeReference*> mInternalAccessSet;
HashContext* mFullHashCtx;
HashContext* mSignatureHashCtx;
Array<NamespaceState> mFileLevelNamespaceState;
int mNamespaceBlockDepth;
int mNamespaceBlockDepth;
public:
void ParseGenericParams(BfGenericParamsDeclaration* genericParamsDecl, BfGenericConstraintsDeclaration* genericConstraints, Array<BfGenericParamDef*>& genericParams, Array<BfExternalConstraintDef>* externConstraintDefs, int outerGenericSize, bool isInGeneric);
BfProtection GetProtection(BfAstNode* protectionNode);
bool WantsNode(BfAstNode* wholeNode, BfAstNode* startNode = NULL, int addLen = 0);
bool WantsNode(BfAstNode* wholeNode, BfAstNode* startNode = NULL, int addLen = 0);
//static BfNamedTypeReference* AllocTypeReference(BfSource* bfSource, const StringImpl& typeName);
//static BfResolvedTypeReference* AllocTypeReference(BfSource* bfSource, BfType* type);
static BfFieldDef* AddField(BfTypeDef* typeDef, BfTypeReference* typeRef, const StringImpl& name);
@ -67,18 +67,18 @@ public:
~BfDefBuilder();
void Process(BfPassInstance* passInstance, BfSource* bfSource, bool fullRefresh);
void RemoveDefsFrom(BfSource* bfSource);
void RemoveDefsFrom(BfSource* bfSource);
virtual void Visit(BfIdentifierNode* identifier) override;
virtual void Visit(BfMethodDeclaration* methodDeclaration) override;
virtual void Visit(BfConstructorDeclaration* ctorDeclaration) override;
virtual void Visit(BfPropertyDeclaration* propertyDeclaration) override;
virtual void Visit(BfFieldDeclaration* fieldDeclaration) override;
virtual void Visit(BfFieldDeclaration* fieldDeclaration) override;
virtual void Visit(BfEnumCaseDeclaration* enumCaseDeclaration) override;
virtual void Visit(BfTypeDeclaration* typeDeclaration) override;
virtual void Visit(BfUsingDirective* usingDirective) override;
virtual void Visit(BfUsingModDirective* usingDirective) override;
virtual void Visit(BfNamespaceDeclaration* namespaceDeclaration) override;
virtual void Visit(BfNamespaceDeclaration* namespaceDeclaration) override;
virtual void Visit(BfBlock* block) override;
virtual void Visit(BfRootNode* rootNode) override;
};

View file

@ -8,14 +8,14 @@ BfDeferEvalChecker::BfDeferEvalChecker()
mRootNode = NULL;
mNeedsDeferEval = false;
mDeferLiterals = true;
mDeferDelegateBind = true;
mDeferDelegateBind = true;
}
void BfDeferEvalChecker::Check(BfAstNode* node)
{
if (auto namedNode = BfNodeDynCastExact<BfNamedExpression>(node))
node = namedNode->mExpression;
if (node == NULL)
return;
@ -46,16 +46,16 @@ void BfDeferEvalChecker::Visit(BfLiteralExpression* literalExpr)
case BfTypeCode_Boolean:
case BfTypeCode_Char8:
case BfTypeCode_Int8:
case BfTypeCode_UInt8:
case BfTypeCode_Int16:
case BfTypeCode_UInt8:
case BfTypeCode_Int16:
case BfTypeCode_UInt16:
case BfTypeCode_Int32:
case BfTypeCode_UInt32:
case BfTypeCode_Int64:
case BfTypeCode_UInt32:
case BfTypeCode_Int64:
case BfTypeCode_UInt64:
case BfTypeCode_IntPtr:
case BfTypeCode_IntPtr:
case BfTypeCode_UIntPtr:
case BfTypeCode_IntUnknown:
case BfTypeCode_IntUnknown:
case BfTypeCode_UIntUnknown:
if (mDeferLiterals)
mNeedsDeferEval = true;
@ -63,11 +63,10 @@ void BfDeferEvalChecker::Visit(BfLiteralExpression* literalExpr)
default:
mNeedsDeferEval = false;
}
}
void BfDeferEvalChecker::Visit(BfCastExpression* castExpr)
{
{
if (auto namedTypeRef = BfNodeDynCastExact<BfNamedTypeReference>(castExpr->mTypeRef))
{
if (namedTypeRef->ToString() == "ExpectedType")
@ -122,11 +121,11 @@ void BfDeferEvalChecker::Visit(BfDelegateBindExpression* delegateBindExpr)
}
void BfDeferEvalChecker::Visit(BfConditionalExpression* condExpr)
{
{
VisitChild(condExpr->mConditionExpression);
bool prev = mNeedsDeferEval;
VisitChild(condExpr->mTrueExpression);
prev |= mNeedsDeferEval;
prev |= mNeedsDeferEval;
VisitChild(condExpr->mFalseExpression);
mNeedsDeferEval |= prev;
}
@ -154,7 +153,7 @@ void BfDeferEvalChecker::Visit(BfObjectCreateExpression * objCreateExpr)
{
if (objCreateExpr->mTypeRef->IsExact<BfDotTypeReference>())
mNeedsDeferEval = true;
}
}
}
void BfDeferEvalChecker::Visit(BfBinaryOperatorExpression* binOpExpr)
@ -170,14 +169,14 @@ void BfDeferEvalChecker::Visit(BfBinaryOperatorExpression* binOpExpr)
case BfBinaryOp_BitwiseOr:
case BfBinaryOp_ExclusiveOr:
case BfBinaryOp_LeftShift:
case BfBinaryOp_RightShift:
case BfBinaryOp_RightShift:
case BfBinaryOp_GreaterThan:
case BfBinaryOp_LessThan:
case BfBinaryOp_GreaterThanOrEqual:
case BfBinaryOp_LessThanOrEqual:
{
VisitChild(binOpExpr->mLeft);
bool prev = mNeedsDeferEval;
bool prev = mNeedsDeferEval;
VisitChild(binOpExpr->mRight);
mNeedsDeferEval |= prev;
}
@ -188,7 +187,7 @@ void BfDeferEvalChecker::Visit(BfBinaryOperatorExpression* binOpExpr)
}
void BfDeferEvalChecker::Visit(BfDefaultExpression* defaultExpr)
{
{
if (defaultExpr->mTypeRef == NULL)
mNeedsDeferEval = true;
}
@ -197,5 +196,4 @@ void BfDeferEvalChecker::Visit(BfVariableDeclaration* varDecl)
{
if (varDecl != mRootNode)
mNeedsDeferEval = true;
}
}

View file

@ -11,7 +11,7 @@ public:
BfAstNode* mRootNode;
bool mNeedsDeferEval;
bool mDeferDelegateBind;
bool mDeferLiterals;
bool mDeferLiterals;
public:
BfDeferEvalChecker();
@ -19,7 +19,7 @@ public:
void Check(BfAstNode* node);
virtual void Visit(BfAstNode* node) override;
virtual void Visit(BfAttributedExpression* attributedExpr) override;
virtual void Visit(BfInitializerExpression* collectionInitExpr) override;
virtual void Visit(BfLiteralExpression* literalExpr) override;
@ -38,5 +38,4 @@ public:
virtual void Visit(BfVariableDeclaration* varDecl) override;
};
NS_BF_END

File diff suppressed because it is too large Load diff

View file

@ -14,7 +14,7 @@ public:
int mCurIdx;
String mResult;
bool mFailed;
String mMangledName;
String mMangledName;
SubstituteList mSubstituteList;
bool mInArgs;
bool mBeefFixed;
@ -28,25 +28,25 @@ public:
class DwDemangler : public DemangleBase
{
public:
public:
SubstituteList mTemplateList;
bool mIsFirstName;
int mTemplateDepth;
bool mOmitSubstituteAdd;
int mTemplateDepth;
bool mOmitSubstituteAdd;
bool mCaptureTargetType;
bool mFunctionPopSubstitute;
bool mRawDemangle;
bool mRawDemangle;
public:
public:
bool DemangleEnd();
bool DemangleArrayType(StringImpl& outName);
bool DemangleBuiltinType(StringImpl& outName);
bool DemangleFunctionType(StringImpl& outName);
bool DemangleSourceName(StringImpl& outName);
bool DemangleRefQualifier(StringImpl& outName);
bool DemangleRefQualifier(StringImpl& outName);
bool DemangleType(StringImpl& outName);
bool DemangleNestedName(StringImpl& outName);
bool DemangleCVQualifiers(StringImpl& outName);
bool DemangleCVQualifiers(StringImpl& outName);
bool DemangleOperatorName(StringImpl& outName);
bool DemangleExprPriamry(StringImpl& outName);
bool DemangleTemplateArgPack(StringImpl& outName);
@ -62,7 +62,7 @@ public:
bool DemangleName(StringImpl& outName, bool* outHasTemplateArgs = NULL);
bool DemangleFunction(StringImpl& outName);
public:
public:
DwDemangler();
String Demangle(const StringImpl& mangledName);
@ -104,7 +104,7 @@ public:
bool DemangleType();
bool DemangleScopedName();
bool DemangleName();
public:
MsDemangleScanner();

View file

@ -6,7 +6,6 @@ USING_NS_BF;
BfElementVisitor::BfElementVisitor()
{
}
void BfElementVisitor::Visit(BfTypedValueExpression* typedValueExpr)
@ -36,7 +35,7 @@ void BfElementVisitor::Visit(BfPreprocessorDefinedExpression* definedExpr)
{
Visit(definedExpr->ToBase());
VisitChild(definedExpr->mIdentifier);
VisitChild(definedExpr->mIdentifier);
}
void BfElementVisitor::Visit(BfAttributeDirective* attributeDirective)
@ -65,7 +64,7 @@ void BfElementVisitor::Visit(BfGenericParamsDeclaration* genericParams)
for (auto& val : genericParams->mGenericParams)
VisitChild(val);
for (auto& val : genericParams->mCommas)
VisitChild(val);
VisitChild(val);
VisitChild(genericParams->mCloseChevron);
}
@ -84,7 +83,7 @@ void BfElementVisitor::Visit(BfGenericConstraintsDeclaration* genericConstraints
Visit(genericConstraints->ToBase());
for (auto genericConstraintNode : genericConstraints->mGenericConstraints)
{
{
if (auto genericConstraint = BfNodeDynCast<BfGenericConstraint>(genericConstraintNode))
{
VisitChild(genericConstraint->mWhereToken);
@ -100,7 +99,7 @@ void BfElementVisitor::Visit(BfGenericConstraintsDeclaration* genericConstraints
VisitChild(genericConstraintExpr->mWhereToken);
VisitChild(genericConstraintExpr->mExpression);
}
}
}
}
void BfElementVisitor::Visit(BfGenericArgumentsNode* genericArgumentsNode)
@ -111,7 +110,7 @@ void BfElementVisitor::Visit(BfGenericArgumentsNode* genericArgumentsNode)
for (auto& val : genericArgumentsNode->mGenericArgs)
VisitChild(val);
for (auto& val : genericArgumentsNode->mCommas)
VisitChild(val);
VisitChild(val);
VisitChild(genericArgumentsNode->mCloseChevron);
}
@ -169,7 +168,7 @@ void BfElementVisitor::Visit(BfNewNode* newNode)
void BfElementVisitor::Visit(BfLabeledBlock* labeledBlock)
{
Visit(labeledBlock->ToBase());
VisitChild(labeledBlock->mBlock);
}
@ -266,7 +265,7 @@ void BfElementVisitor::Visit(BfQualifiedNameNode* nameNode)
void BfElementVisitor::Visit(BfThisExpression* thisExpr)
{
Visit(thisExpr->ToBase());
Visit(thisExpr->ToBase());
}
void BfElementVisitor::Visit(BfBaseExpression* baseExpr)
@ -306,9 +305,9 @@ void BfElementVisitor::Visit(BfCollectionInitializerExpression* collectionInitEx
VisitChild(collectionInitExpr->mOpenBrace);
for (auto& val : collectionInitExpr->mValues)
VisitChild(val);
VisitChild(val);
for (auto& val : collectionInitExpr->mCommas)
VisitChild(val);
VisitChild(val);
VisitChild(collectionInitExpr->mCloseBrace);
}
@ -327,7 +326,7 @@ void BfElementVisitor::Visit(BfNamedTypeReference* typeRef)
void BfElementVisitor::Visit(BfQualifiedTypeReference* qualifiedTypeRef)
{
Visit(qualifiedTypeRef->ToBase());
VisitChild(qualifiedTypeRef->mLeft);
VisitChild(qualifiedTypeRef->mDot);
VisitChild(qualifiedTypeRef->mRight);
@ -381,17 +380,17 @@ void BfElementVisitor::Visit(BfConstExprTypeRef* typeRef)
void BfElementVisitor::Visit(BfRefTypeRef* typeRef)
{
Visit((BfTypeReference*)typeRef); // Skip the Elemented part so we can put the element in the right spot
VisitChild(typeRef->mRefToken);
VisitChild(typeRef->mElementType);
}
void BfElementVisitor::Visit(BfModifiedTypeRef * typeRef)
{
{
Visit((BfTypeReference*)typeRef); // Skip the Elemented part so we can put the element in the right spot
VisitChild(typeRef->mRetTypeToken);
VisitChild(typeRef->mOpenParen);
VisitChild(typeRef->mOpenParen);
VisitChild(typeRef->mElementType);
VisitChild(typeRef->mCloseParen);
}
@ -399,11 +398,11 @@ void BfElementVisitor::Visit(BfModifiedTypeRef * typeRef)
void BfElementVisitor::Visit(BfArrayTypeRef* typeRef)
{
Visit((BfTypeReference*)typeRef); // Skip the Elemented part so we can put the element in the right spot
VisitChild(typeRef->mElementType);
VisitChild(typeRef->mOpenBracket);
for (auto& val : typeRef->mParams)
VisitChild(val);
VisitChild(val);
VisitChild(typeRef->mCloseBracket);
}
@ -413,7 +412,7 @@ void BfElementVisitor::Visit(BfGenericInstanceTypeRef* typeRef)
VisitChild(typeRef->mOpenChevron);
for (auto& val : typeRef->mGenericArguments)
VisitChild(val);
VisitChild(val);
if (typeRef->mCommas.mVals != NULL)
{
for (auto& val : typeRef->mCommas)
@ -428,7 +427,7 @@ void BfElementVisitor::Visit(BfTupleTypeRef* typeRef)
VisitChild(typeRef->mOpenParen);
for (auto& val : typeRef->mFieldNames)
VisitChild(val);
VisitChild(val);
for (auto& val : typeRef->mFieldTypes)
VisitChild(val);
if (typeRef->mCommas.mVals != NULL)
@ -535,7 +534,7 @@ void BfElementVisitor::Visit(BfNameOfExpression* nameOfExpr)
VisitChild(nameOfExpr->mToken);
VisitChild(nameOfExpr->mOpenParen);
VisitChild(nameOfExpr->mTarget);
VisitChild(nameOfExpr->mTarget);
VisitChild(nameOfExpr->mCloseParen);
}
@ -608,16 +607,16 @@ void BfElementVisitor::Visit(BfLambdaBindExpression* lambdaBindExpr)
Visit(lambdaBindExpr->ToBase());
VisitChild(lambdaBindExpr->mNewToken);
VisitChild(lambdaBindExpr->mOpenParen);
VisitChild(lambdaBindExpr->mCloseParen);
for (auto& val : lambdaBindExpr->mParams)
VisitChild(val);
for (auto& val : lambdaBindExpr->mCommas)
VisitChild(val);
VisitChild(val);
VisitChild(lambdaBindExpr->mFatArrowToken);
VisitChild(lambdaBindExpr->mBody); // Either expression or block
VisitChild(lambdaBindExpr->mDtor);
}
@ -627,13 +626,13 @@ void BfElementVisitor::Visit(BfObjectCreateExpression* newExpr)
VisitChild(newExpr->mNewNode);
VisitChild(newExpr->mStarToken);
VisitChild(newExpr->mTypeRef);
VisitChild(newExpr->mTypeRef);
VisitChild(newExpr->mOpenToken);
VisitChild(newExpr->mCloseToken);
VisitChild(newExpr->mCloseToken);
for (auto& val : newExpr->mArguments)
VisitChild(val);
for (auto& val : newExpr->mCommas)
VisitChild(val);
VisitChild(val);
}
void BfElementVisitor::Visit(BfBoxExpression* boxExpr)
@ -665,7 +664,7 @@ void BfElementVisitor::Visit(BfThrowStatement* throwStmt)
void BfElementVisitor::Visit(BfDeleteStatement* deleteStmt)
{
Visit(deleteStmt->ToBase());
VisitChild(deleteStmt->mDeleteToken);
VisitChild(deleteStmt->mTargetTypeToken);
VisitChild(deleteStmt->mAllocExpr);
@ -683,7 +682,7 @@ void BfElementVisitor::Visit(BfInvocationExpression* invocationExpr)
for (auto& val : invocationExpr->mArguments)
VisitChild(val);
for (auto& val : invocationExpr->mCommas)
VisitChild(val);
VisitChild(val);
}
void BfElementVisitor::Visit(BfEnumCaseBindExpression* caseBindExpr)
@ -713,7 +712,7 @@ void BfElementVisitor::Visit(BfSwitchCase* switchCase)
for (auto& val : switchCase->mCaseExpressions)
VisitChild(val);
for (auto& val : switchCase->mCaseCommas)
VisitChild(val);
VisitChild(val);
VisitChild(switchCase->mColonToken);
VisitChild(switchCase->mCodeBlock);
VisitChild(switchCase->mEndingToken);
@ -808,13 +807,13 @@ void BfElementVisitor::Visit(BfDeferStatement* deferStmt)
if (deferStmt->mBind != NULL)
{
auto bind = deferStmt->mBind;
VisitChild(bind->mOpenBracket);
VisitChild(bind->mOpenBracket);
VisitChild(bind->mCloseBracket);
for (auto& val : bind->mParams)
VisitChild(val);
for (auto& val : bind->mCommas)
VisitChild(val);
VisitChild(val);
}
VisitChild(deferStmt->mOpenParen);
@ -849,7 +848,6 @@ void BfElementVisitor::Visit(BfUsingStatement* usingStmt)
VisitChild(usingStmt->mVariableDeclaration);
VisitChild(usingStmt->mCloseParen);
VisitChild(usingStmt->mEmbeddedStatement);
}
void BfElementVisitor::Visit(BfDoStatement* doStmt)
@ -857,7 +855,7 @@ void BfElementVisitor::Visit(BfDoStatement* doStmt)
Visit(doStmt->ToBase());
VisitChild(doStmt->mDoToken);
VisitChild(doStmt->mEmbeddedStatement);
VisitChild(doStmt->mEmbeddedStatement);
}
void BfElementVisitor::Visit(BfRepeatStatement* repeatStmt)
@ -915,14 +913,14 @@ void BfElementVisitor::Visit(BfForStatement* forStmt)
for (auto& val : forStmt->mInitializers)
VisitChild(val);
for (auto& val : forStmt->mInitializerCommas)
VisitChild(val);
VisitChild(val);
VisitChild(forStmt->mInitializerSemicolon);
VisitChild(forStmt->mCondition);
VisitChild(forStmt->mConditionSemicolon);
for (auto& val : forStmt->mIterators)
VisitChild(val);
for (auto& val : forStmt->mIteratorCommas)
VisitChild(val);
VisitChild(val);
VisitChild(forStmt->mCloseParen);
VisitChild(forStmt->mEmbeddedStatement);
}
@ -982,12 +980,12 @@ void BfElementVisitor::Visit(BfTupleExpression* tupleExpr)
{
VisitChild(val->mNameNode);
VisitChild(val->mColonToken);
}
}
}
for (auto& val : tupleExpr->mValues)
VisitChild(val);
for (auto& val : tupleExpr->mCommas)
VisitChild(val);
VisitChild(val);
VisitChild(tupleExpr->mCloseParen);
}
@ -1006,11 +1004,11 @@ void BfElementVisitor::Visit(BfIndexerExpression* indexerExpr)
VisitChild(indexerExpr->mTarget);
VisitChild(indexerExpr->mOpenBracket);
VisitChild(indexerExpr->mCloseBracket);
VisitChild(indexerExpr->mCloseBracket);
for (auto& arg : indexerExpr->mArguments)
VisitChild(arg);
for (auto& comma : indexerExpr->mCommas)
VisitChild(comma);
VisitChild(comma);
}
void BfElementVisitor::Visit(BfUnaryOperatorExpression* binOpExpr)
@ -1052,11 +1050,11 @@ void BfElementVisitor::Visit(BfMethodDeclaration* methodDeclaration)
{
Visit(methodDeclaration->ToBase());
VisitChild(methodDeclaration->mAttributes);
VisitChild(methodDeclaration->mAttributes);
VisitChild(methodDeclaration->mProtectionSpecifier);
VisitChild(methodDeclaration->mReadOnlySpecifier);
VisitChild(methodDeclaration->mStaticSpecifier);
VisitChild(methodDeclaration->mExternSpecifier);
VisitChild(methodDeclaration->mVirtualSpecifier); // either 'virtual', 'override', or 'abstract'
VisitChild(methodDeclaration->mNewSpecifier);
@ -1072,7 +1070,7 @@ void BfElementVisitor::Visit(BfMethodDeclaration* methodDeclaration)
for (auto& param : methodDeclaration->mParams)
VisitChild(param);
for (auto& comma : methodDeclaration->mCommas)
VisitChild(comma);
VisitChild(comma);
VisitChild(methodDeclaration->mCloseParen);
VisitChild(methodDeclaration->mGenericParams);
VisitChild(methodDeclaration->mGenericConstraintsDeclaration);
@ -1109,26 +1107,26 @@ void BfElementVisitor::Visit(BfPropertyBodyExpression* propertyBodyExpression)
Visit(propertyBodyExpression->ToBase());
VisitChild(propertyBodyExpression->mMutSpecifier);
VisitChild(propertyBodyExpression->mFatTokenArrow);
VisitChild(propertyBodyExpression->mFatTokenArrow);
}
void BfElementVisitor::Visit(BfPropertyDeclaration* propertyDeclaration)
{
Visit(propertyDeclaration->ToBase());
VisitChild(propertyDeclaration->mAttributes);
VisitChild(propertyDeclaration->mAttributes);
VisitChild(propertyDeclaration->mProtectionSpecifier);
VisitChild(propertyDeclaration->mStaticSpecifier);
VisitChild(propertyDeclaration->mVirtualSpecifier); // either 'virtual', 'override', or 'abstract'
VisitChild(propertyDeclaration->mExplicitInterface);
VisitChild(propertyDeclaration->mExplicitInterfaceDotToken);
if (auto block = BfNodeDynCast<BfBlock>(propertyDeclaration->mDefinitionBlock))
{
VisitChild(block->mOpenBrace);
for (auto& method : propertyDeclaration->mMethods)
VisitChild(method);
VisitChild(method);
VisitChild(block->mCloseBrace);
}
else
@ -1156,7 +1154,7 @@ void BfElementVisitor::Visit(BfFieldDeclaration* fieldDeclaration)
{
Visit(fieldDeclaration->ToBase());
VisitChild(fieldDeclaration->mAttributes);
VisitChild(fieldDeclaration->mAttributes);
VisitChild(fieldDeclaration->mProtectionSpecifier);
VisitChild(fieldDeclaration->mStaticSpecifier);
@ -1181,7 +1179,7 @@ void BfElementVisitor::Visit(BfEnumCaseDeclaration* enumCaseDeclaration)
for (auto& entry : enumCaseDeclaration->mEntries)
VisitChild(entry);
for (auto& comma : enumCaseDeclaration->mCommas)
VisitChild(comma);
VisitChild(comma);
}
void BfElementVisitor::Visit(BfFieldDtorDeclaration* fieldDtorDeclaration)
@ -1199,7 +1197,7 @@ void BfElementVisitor::Visit(BfTypeDeclaration* typeDeclaration)
VisitChild(typeDeclaration->mAttributes);
VisitChild(typeDeclaration->mAbstractSpecifier);
VisitChild(typeDeclaration->mSealedSpecifier);
VisitChild(typeDeclaration->mSealedSpecifier);
VisitChild(typeDeclaration->mProtectionSpecifier);
VisitChild(typeDeclaration->mStaticSpecifier);
VisitChild(typeDeclaration->mPartialSpecifier);
@ -1210,7 +1208,7 @@ void BfElementVisitor::Visit(BfTypeDeclaration* typeDeclaration)
for (auto& baseClass : typeDeclaration->mBaseClasses)
VisitChild(baseClass);
for (auto& comma : typeDeclaration->mBaseClassCommas)
VisitChild(comma);
VisitChild(comma);
VisitChild(typeDeclaration->mGenericParams);
VisitChild(typeDeclaration->mGenericConstraintsDeclaration);
@ -1221,7 +1219,6 @@ void BfElementVisitor::Visit(BfTypeDeclaration* typeDeclaration)
for (auto& member : *typeDeclaration->mDefineBlock)
VisitChild(member);
}*/
}
void BfElementVisitor::Visit(BfTypeAliasDeclaration* typeDeclaration)
@ -1237,7 +1234,7 @@ void BfElementVisitor::Visit(BfUsingDirective* usingDirective)
{
Visit(usingDirective->ToBase());
VisitChild(usingDirective->mUsingToken);
VisitChild(usingDirective->mUsingToken);
VisitChild(usingDirective->mNamespace);
}

View file

@ -48,7 +48,7 @@ public:
virtual void Visit(BfMixinExpression* thisExpr);
virtual void Visit(BfSizedArrayCreateExpression* createExpr);
virtual void Visit(BfInitializerExpression* initExpr);
virtual void Visit(BfCollectionInitializerExpression* collectionInitExpr);
virtual void Visit(BfCollectionInitializerExpression* collectionInitExpr);
virtual void Visit(BfTypeReference* typeRef);
virtual void Visit(BfNamedTypeReference* typeRef);
virtual void Visit(BfQualifiedTypeReference* qualifiedType);
@ -69,8 +69,8 @@ public:
virtual void Visit(BfNullableTypeRef* typeRef);
virtual void Visit(BfVariableDeclaration* varDecl);
virtual void Visit(BfLocalMethodDeclaration* methodDecl);
virtual void Visit(BfParameterDeclaration* paramDecl);
virtual void Visit(BfTypeAttrExpression* typeAttrExpr);
virtual void Visit(BfParameterDeclaration* paramDecl);
virtual void Visit(BfTypeAttrExpression* typeAttrExpr);
virtual void Visit(BfOffsetOfExpression* offsetOfExpr);
virtual void Visit(BfNameOfExpression* nameOfExpr);
virtual void Visit(BfDefaultExpression* defaultExpr);
@ -85,7 +85,7 @@ public:
virtual void Visit(BfBoxExpression* boxExpr);
virtual void Visit(BfScopedInvocationTarget* scopedTarget);
virtual void Visit(BfInvocationExpression* invocationExpr);
virtual void Visit(BfDeferStatement* deferStmt);
virtual void Visit(BfDeferStatement* deferStmt);
virtual void Visit(BfEnumCaseBindExpression* caseBindExpr);
virtual void Visit(BfCaseExpression* caseExpr);
virtual void Visit(BfSwitchCase* switchCase);

View file

@ -762,7 +762,6 @@ void BfMethodMatcher::CompareMethods(BfMethodInstance* prevMethodInstance, BfTyp
return;
}
if (newMethodDef->mExplicitInterface != prevMethodDef->mExplicitInterface)
{
if (mModule->CompareMethodSignatures(newMethodInstance, prevMethodInstance))
@ -1594,7 +1593,6 @@ bool BfMethodMatcher::InferFromGenericConstraints(BfMethodInstance* methodInstan
if (checkOpConstraint.mCastToken == BfToken_Implicit)
{
}
else
{
@ -1603,7 +1601,6 @@ bool BfMethodMatcher::InferFromGenericConstraints(BfMethodInstance* methodInstan
if (checkOpConstraint.mCastToken == BfToken_Explicit)
{
}
else
{
@ -1755,7 +1752,6 @@ bool BfMethodMatcher::CheckMethod(BfTypeInstance* targetTypeInstance, BfTypeInst
}
}
if (mHasArgNames)
{
checkMethod->BuildParamNameMap();
@ -1788,7 +1784,6 @@ bool BfMethodMatcher::CheckMethod(BfTypeInstance* targetTypeInstance, BfTypeInst
}
}
for (auto& checkGenericArgRef : mCheckMethodGenericArguments)
checkGenericArgRef = NULL;
@ -3068,7 +3063,6 @@ void BfMethodMatcher::TryDevirtualizeCall(BfTypedValue target, BfTypedValue* ori
// Failed
mFakeConcreteTarget = true;
}
}
}
}
@ -3796,7 +3790,6 @@ void BfExprEvaluator::Visit(BfCaseExpression* caseExpr)
if (mResult)
return;
}
if ((caseValAddr) && (IsVar(caseValAddr.mType)))
@ -5523,7 +5516,6 @@ BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue tar
else
findName.Reference(fieldName);
auto activeTypeDef = mModule->GetActiveTypeDef();
for (int pass = 0; pass < 2; pass++)
{
@ -6990,8 +6982,6 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, BfMethodInstance*
return result;
}
BfTypedValue BfExprEvaluator::CreateCall(BfMethodMatcher* methodMatcher, BfTypedValue target)
{
auto moduleMethodInstance = GetSelectedMethod(*methodMatcher);
@ -7273,7 +7263,6 @@ void BfExprEvaluator::PushThis(BfAstNode* targetSrc, BfTypedValue argVal, BfMeth
}
}
}
}
if (argVal.mType->IsValuelessType())
@ -7921,7 +7910,6 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, const BfTypedValu
mModule->Warn(BfWarning_BF4205_StringInterpolationParam, "Expanded string interpolation argument not used as 'params'. If string allocation was intended then consider adding a specifier such as 'scope'.", errorRef);
}
// if ((arg == NULL) && (argValues[argExprIdx].mExpression != NULL))
// hadMissingArg = true;
@ -8009,7 +7997,6 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, const BfTypedValu
if (auto typerDecl = BfNodeDynCast<BfTypeDeclaration>(mModule->mParentNodeEntry->mNode))
showCtorError = true;
if (showCtorError)
{
if (mModule->PreFail())
@ -8848,7 +8835,6 @@ BfTypedValue BfExprEvaluator::ResolveArgValue(BfResolvedArg& resolvedArg, BfType
}
}
if (wantType->IsRef())
{
auto refType = (BfRefType*)wantType;
@ -9587,7 +9573,6 @@ BfTypedValue BfExprEvaluator::MatchMethod(BfAstNode* targetSrc, BfMethodBoundExp
else if (isUnboundCall)
{
//auto resolvedType = mModule->ResolveGenericType(lookupType);
}
else if (lookupType->IsGenericParam())
{
@ -9869,7 +9854,6 @@ BfTypedValue BfExprEvaluator::MatchMethod(BfAstNode* targetSrc, BfMethodBoundExp
if (resolvedType != NULL)
resolvedTypeInstance = resolvedType->ToTypeInstance();
}
}
else
{
@ -10198,7 +10182,6 @@ BfTypedValue BfExprEvaluator::MatchMethod(BfAstNode* targetSrc, BfMethodBoundExp
if (methodDef == NULL)
{
}
// This will flush out any new ambiguity errors from extension methods
@ -10587,7 +10570,6 @@ BfTypedValue BfExprEvaluator::MatchMethod(BfAstNode* targetSrc, BfMethodBoundExp
mModule->MethodToString(moduleMethodInstance.mMethodInstance).c_str(), mModule->MethodToString(mModule->mCurMethodInstance).c_str()), targetSrc);
}
BfTypedValue result;
BfTypedValue argCascade;
@ -10950,7 +10932,6 @@ void BfExprEvaluator::LookupQualifiedName(BfAstNode* nameNode, BfIdentifierNode*
{
if (mResult.mType->IsSizedArray())
{
if (mResult.mType->IsValuelessType())
{
mResult.mType = mModule->GetWrappedStructType(mResult.mType);
@ -12935,7 +12916,6 @@ BfTypedValue BfExprEvaluator::DoImplicitArgCapture(BfAstNode* refNode, BfIdentif
BfLocalVarEntry* entry;
if (checkMethodState->mLocalVarSet.TryGetWith<StringImpl&>(findName, &entry))
{
auto varDecl = entry->mLocalVar;
while (varDecl != NULL)
@ -12961,7 +12941,6 @@ BfTypedValue BfExprEvaluator::DoImplicitArgCapture(BfAstNode* refNode, BfIdentif
varDecl = varDecl->mShadowedLocal;
}
}
// Check for the captured locals. It's important we do it here so we get local-first precedence still
@ -13233,7 +13212,6 @@ void BfExprEvaluator::Visit(BfDelegateBindExpression* delegateBindExpr)
else
delegateTypeInstance = mExpectingType->ToTypeInstance();
if ((delegateTypeInstance == NULL) ||
((!delegateTypeInstance->IsDelegate()) && (!delegateTypeInstance->IsFunction())))
{
@ -14713,7 +14691,6 @@ BfLambdaInstance* BfExprEvaluator::GetLambdaInstance(BfLambdaBindExpression* lam
mModule->mBfIRBuilder->PopulateType(useTypeInstance);
mModule->PopulateType(useTypeInstance);
methodDef->mIsStatic = closureTypeInst == NULL;
SizedArray<BfIRType, 8> origParamTypes;
@ -14860,7 +14837,6 @@ BfLambdaInstance* BfExprEvaluator::GetLambdaInstance(BfLambdaBindExpression* lam
mModule->mBfIRBuilder->SaveDebugLocation();
//
{
BfGetSymbolReferenceKind prevSymbolRefKind = BfGetSymbolReferenceKind_None;
if (mModule->mCompiler->mResolvePassData != NULL)
{
@ -15642,7 +15618,6 @@ void BfExprEvaluator::CreateObject(BfObjectCreateExpression* objCreateExpr, BfAs
BfInitContext(BfModule* module, BfType* resultType, int dimensions, SizedArray<BfIRValue, 2>& dimLengthVals, BfIRValue arraySize, int& writeIdx) :
mModule(module), resultType(resultType), dimensions(dimensions), dimLengthVals(dimLengthVals), arraySize(arraySize), writeIdx(writeIdx)
{
}
void Handle(BfIRValue addr, int curDim, const BfSizedArray<BfExpression*>& valueExprs)
@ -16160,7 +16135,6 @@ void BfExprEvaluator::CreateObject(BfObjectCreateExpression* objCreateExpr, BfAs
/*if (typeInstance != NULL)
{
mModule->InitTypeInst(mResult, scopeData, true);
}
if (isStackAlloc)
@ -18089,11 +18063,9 @@ void BfExprEvaluator::DoInvocation(BfAstNode* target, BfMethodBoundExpression* m
{
if (mExpectingType->IsVar())
{
}
mResult = BfTypedValue(mExpectingType);
}
else if (!gaveUnqualifiedDotError)
mModule->Fail("Unqualified dot syntax can only be used when the result type can be inferred", memberRefExpression->mDotToken);
@ -18135,7 +18107,6 @@ void BfExprEvaluator::DoInvocation(BfAstNode* target, BfMethodBoundExpression* m
thisValue = mResult;
mResult = BfTypedValue();
}
}
if (mPropDef != NULL)
thisValue = GetResult(true);
@ -18220,7 +18191,6 @@ void BfExprEvaluator::DoInvocation(BfAstNode* target, BfMethodBoundExpression* m
flags = (BfEvalExprFlags)(flags | BfEvalExprFlags_AllowRefExpr);
expr = paranExpr->mExpression;
}
}
if (expr != NULL)
mResult = mModule->CreateValueFromExpression(expr, expectingTargetType, flags);
@ -18349,7 +18319,6 @@ void BfExprEvaluator::DoInvocation(BfAstNode* target, BfMethodBoundExpression* m
mResult = BfTypedValue();
}
}
}
if (mPropDef != NULL)
thisValue = GetResult(true);
@ -18940,7 +18909,6 @@ BfMethodDef* BfExprEvaluator::GetPropertyMethodDef(BfPropertyDef* propDef, BfMet
if (methodDef->mMethodType != methodType)
continue;
if (methodDef->mCheckedKind == checkedKind)
{
matchedMethod = methodDef;
@ -19623,8 +19591,6 @@ bool BfExprEvaluator::CheckModifyResult(BfTypedValue& typedVal, BfAstNode* refNo
break;
}
}
}
}
@ -20098,7 +20064,6 @@ BfTypedValue BfExprEvaluator::PerformAssignment_CheckOp(BfAssignmentExpression*
return leftValue;
}
checkTypeInst = mModule->GetBaseType(checkTypeInst);
}
@ -21945,7 +21910,6 @@ void BfExprEvaluator::Visit(BfIndexerExpression* indexerExpr)
}
else
{
auto indexResult = mModule->CreateIndexedValue(underlyingType, target.mValue, indexArgument.mValue);
mResult = BfTypedValue(indexResult, underlyingType, target.IsReadOnly() ? BfTypedValueKind_ReadOnlyAddr : BfTypedValueKind_Addr);
}
@ -22037,7 +22001,6 @@ void BfExprEvaluator::PerformUnaryOperation(BfExpression* unaryOpExpr, BfUnaryOp
mExpectingType = prevExpedcting;
}
BfExprEvaluator::PerformUnaryOperation_OnResult(unaryOpExpr, unaryOp, opToken, opFlags);
}
@ -22998,7 +22961,6 @@ bool BfExprEvaluator::PerformBinaryOperation_NullCoalesce(BfTokenNode* opToken,
mModule->AddBasicBlock(rhsBB);
BfTypedValue rightValue;
if (assignTo != NULL)
rightValue = mModule->CreateValueFromExpression(rightExpression, wantType, (BfEvalExprFlags)((mBfEvalExprFlags & BfEvalExprFlags_InheritFlags) | BfEvalExprFlags_CreateConditionalScope));
else
@ -25079,4 +25041,4 @@ void BfExprEvaluator::Visit(BfBinaryOperatorExpression* binOpExpr)
}
PerformBinaryOperation(binOpExpr->mLeft, binOpExpr->mRight, binOpExpr->mOp, binOpExpr->mOpToken, BfBinOpFlag_None);
}
}

View file

@ -7,7 +7,7 @@ NS_BF_BEGIN
enum BfArgFlags
{
BfArgFlag_None = 0,
BfArgFlag_None = 0,
BfArgFlag_DelegateBindAttempt = 1,
BfArgFlag_LambdaBindAttempt = 2,
BfArgFlag_UnqualifiedDotAttempt = 4,
@ -62,7 +62,7 @@ public:
BfIdentifierNode* mNameNode;
BfType* mResolvedType;
BfAstNode* mExpression;
BfArgFlags mArgFlags;
BfArgFlags mArgFlags;
BfType* mExpectedType;
BfType* mBestBoundType;
bool mWantsRecalc;
@ -87,10 +87,10 @@ public:
struct BfResolvedArgs
{
SizedArray<BfResolvedArg, 4> mResolvedArgs;
SizedArray<BfResolvedArg, 4> mResolvedArgs;
BfTokenNode* mOpenToken;
const BfSizedArray<BfExpression*>* mArguments;
const BfSizedArray<BfTokenNode*>* mCommas;
const BfSizedArray<BfTokenNode*>* mCommas;
BfTokenNode* mCloseToken;
public:
@ -134,8 +134,7 @@ public:
mCloseToken = NULL;
}
void HandleFixits(BfModule* module);
void HandleFixits(BfModule* module);
};
class BfGenericInferContext
@ -145,13 +144,13 @@ public:
BfModule* mModule;
BfTypeVector* mCheckMethodGenericArguments;
SizedArray<BfIRValue, 4> mPrevArgValues;
int mInferredCount;
int mInferredCount;
public:
BfGenericInferContext()
{
mModule = NULL;
mInferredCount = 0;
mInferredCount = 0;
}
bool AddToCheckedSet(BfType* argType, BfType* wantType);
@ -166,13 +165,13 @@ public:
struct BfMethodGenericArguments
{
BfSizedArray<BfAstNode*>* mArguments;
BfSizedArray<BfAstNode*>* mArguments;
bool mIsPartial;
bool mIsOpen; // Ends with ...
BfMethodGenericArguments()
{
mArguments = NULL;
mArguments = NULL;
mIsPartial = false;
mIsOpen = false;
}
@ -198,17 +197,17 @@ public:
{
BackupMatchKind_None,
BackupMatchKind_TooManyArgs,
BackupMatchKind_EarlyMismatch,
BackupMatchKind_EarlyMismatch,
BackupMatchKind_PartialLastArgMatch
};
public:
BfAstNode* mTargetSrc;
BfTypedValue mTarget;
BfTypedValue mOrigTarget;
BfModule* mModule;
BfTypeDef* mActiveTypeDef;
String mMethodName;
String mMethodName;
BfMethodInstance* mInterfaceMethodInstance;
SizedArrayImpl<BfResolvedArg>& mArguments;
BfType* mCheckReturnType;
@ -216,32 +215,32 @@ public:
BfCheckedKind mCheckedKind;
Array<SizedArray<BfUsingFieldData::MemberRef, 1>*>* mUsingLists;
bool mHasArgNames;
bool mHadExplicitGenericArguments;
bool mHadExplicitGenericArguments;
bool mHadOpenGenericArguments;
bool mHadPartialGenericArguments;
bool mHasVarArguments;
bool mHasVarArguments;
bool mHadVarConflictingReturnType;
bool mBypassVirtual;
bool mAllowImplicitThis;
bool mAllowImplicitRef;
bool mAllowImplicitWrap;
bool mAllowStatic;
bool mAllowNonStatic;
bool mSkipImplicitParams;
bool mAllowNonStatic;
bool mSkipImplicitParams;
bool mAutoFlushAmbiguityErrors;
BfEvalExprFlags mBfEvalExprFlags;
int mMethodCheckCount;
BfType* mExplicitInterfaceCheck;
int mMethodCheckCount;
BfType* mExplicitInterfaceCheck;
MatchFailKind mMatchFailKind;
BfTypeVector mCheckMethodGenericArguments;
BfTypeVector mCheckMethodGenericArguments;
BfType* mSelfType; // Only when matching interfaces when 'Self' needs to refer back to the implementing type
BfMethodDef* mBackupMethodDef;
BackupMatchKind mBackupMatchKind;
BackupMatchKind mBackupMatchKind;
int mBackupArgMatchCount;
BfMethodDef* mBestMethodDef;
BfTypeInstance* mBestMethodTypeInstance;
BfTypeInstance* mBestMethodTypeInstance;
BfMethodInstance* mBestRawMethodInstance;
BfModuleMethodInstance mBestMethodInstance;
SizedArray<int, 4> mBestMethodGenericArgumentSrcs;
@ -254,9 +253,9 @@ public:
BfTypedValue ResolveArgTypedValue(BfResolvedArg& resolvedArg, BfType* checkType, BfTypeVector* genericArgumentsSubstitute, BfType *origCheckType = NULL, BfResolveArgFlags flags = BfResolveArgFlag_None);
bool InferFromGenericConstraints(BfMethodInstance* methodInstance, BfGenericParamInstance* genericParamInst, BfTypeVector* methodGenericArgs);
void CompareMethods(BfMethodInstance* prevMethodInstance, BfTypeVector* prevGenericArgumentsSubstitute,
BfMethodInstance* newMethodInstance, BfTypeVector* genericArgumentsSubstitute,
BfMethodInstance* newMethodInstance, BfTypeVector* genericArgumentsSubstitute,
bool* outNewIsBetter, bool* outNewIsWorse, bool allowSpecializeFail);
void FlushAmbiguityError();
void FlushAmbiguityError();
bool IsType(BfTypedValue& val, BfType* type);
int GetMostSpecificType(BfType* lhs, BfType* rhs); // 0, 1, or -1
@ -317,8 +316,8 @@ class BfFunctionBindResult
{
public:
BfTypedValue mOrigTarget;
BfTypedValue mTarget;
BfIRValue mFunc;
BfTypedValue mTarget;
BfIRValue mFunc;
BfMethodInstance* mMethodInstance;
BfType* mBindType;
bool mSkipThis;
@ -329,7 +328,7 @@ public:
public:
BfFunctionBindResult()
{
{
mMethodInstance = NULL;
mBindType = NULL;
mSkipMutCheck = false;
@ -342,7 +341,7 @@ public:
struct DeferredTupleAssignData
{
struct Entry
{
{
BfExpression* mExpr;
BfType* mVarType;
BfAstNode* mVarNameNode;
@ -359,8 +358,8 @@ struct DeferredTupleAssignData
enum BfImplicitParamKind
{
BfImplicitParamKind_General,
BfImplicitParamKind_GenericMethodMember,
BfImplicitParamKind_GenericTypeMember,
BfImplicitParamKind_GenericMethodMember,
BfImplicitParamKind_GenericTypeMember,
BfImplicitParamKind_GenericTypeMember_Addr,
};
@ -409,11 +408,11 @@ public:
BfGetMethodInstanceFlags mPropGetMethodFlags;
BfCheckedKind mPropCheckedKind;
BfPropertyDef* mPropDef;
BfType* mExpectingType;
BfType* mExpectingType;
BfAttributeState* mPrefixedAttributeState;
BfTypedValue* mReceivingValue;
BfTypedValue* mReceivingValue;
BfFunctionBindResult* mFunctionBindResult;
SizedArray<BfResolvedArg, 2> mIndexerValues;
SizedArray<BfResolvedArg, 2> mIndexerValues;
BfAstNode* mDeferCallRef;
BfScopeData* mDeferScopeAlloc;
bool mUsedAsStatement;
@ -434,18 +433,18 @@ public:
bool CheckForMethodName(BfAstNode* refNode, BfTypeInstance* typeInst, const StringImpl& findName);
bool IsVar(BfType* type, bool forceIgnoreWrites = false);
void GetLiteral(BfAstNode* refNode, const BfVariant& variant);
void FinishExpressionResult();
virtual bool CheckAllowValue(const BfTypedValue& typedValue, BfAstNode* refNode);
BfAutoComplete* GetAutoComplete();
void FinishExpressionResult();
virtual bool CheckAllowValue(const BfTypedValue& typedValue, BfAstNode* refNode);
BfAutoComplete* GetAutoComplete();
bool IsComptime();
bool IsConstEval();
bool IsComptimeEntry();
int GetStructRetIdx(BfMethodInstance* methodInstance, bool forceStatic = false);
BfTypedValue SetupNullConditional(BfTypedValue target, BfTokenNode* dotToken);
void Evaluate(BfAstNode* astNode, bool propogateNullConditional = false, bool ignoreNullConditional = false, bool allowSplat = true);
void Evaluate(BfAstNode* astNode, bool propogateNullConditional = false, bool ignoreNullConditional = false, bool allowSplat = true);
BfType* BindGenericType(BfAstNode* node, BfType* bindType);
BfType* ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType populateType = BfPopulateType_Data, BfResolveTypeRefFlags resolveFlags = (BfResolveTypeRefFlags)0);
void ResolveGenericType();
void ResolveGenericType();
void ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveArgsFlags flags = BfResolveArgsFlag_None);
void ResolveAllocTarget(BfAllocTarget& allocTarget, BfAstNode* newNode, BfTokenNode*& newToken, BfCustomAttributes** outCustomAttributes = NULL);
BfTypedValue ResolveArgValue(BfResolvedArg& resolvedArg, BfType* wantType, BfTypedValue* receivingValue = NULL, BfParamKind paramKind = BfParamKind_Normal, BfIdentifierNode* paramNameNode = NULL);
@ -453,21 +452,21 @@ public:
BfModuleMethodInstance GetPropertyMethodInstance(BfMethodDef* methodDef);
void CheckPropFail(BfMethodDef* propMethodDef, BfMethodInstance* methodInstance, bool checkProt);
bool HasResult();
BfTypedValue GetResult(bool clearResult = false, bool resolveGenericType = false);
BfTypedValue GetResult(bool clearResult = false, bool resolveGenericType = false);
void CheckResultForReading(BfTypedValue& typedValue);
void MarkResultUsed();
void MarkResultAssigned();
void MakeResultAsValue();
void MakeResultAsValue();
bool CheckIsBase(BfAstNode* checkNode);
bool CheckModifyResult(BfTypedValue& typeValue, BfAstNode* refNode, const char* modifyType, bool onlyNeedsMut = false, bool emitWarning = false, bool skipCopyOnMutate = false);
bool CheckGenericCtor(BfGenericParamType* genericParamType, BfResolvedArgs& argValues, BfAstNode* targetSrc);
BfTypedValue LoadProperty(BfAstNode* targetSrc, BfTypedValue target, BfTypeInstance* typeInstance, BfPropertyDef* prop, BfLookupFieldFlags flags, BfCheckedKind checkedKind, bool isInline);
BfTypedValue LoadField(BfAstNode* targetSrc, BfTypedValue target, BfTypeInstance* typeInstance, BfFieldDef* fieldDef, BfLookupFieldFlags flags);
BfTypedValue LookupField(BfAstNode* targetSrc, BfTypedValue target, const StringImpl& fieldName, BfLookupFieldFlags flags = BfLookupFieldFlag_None);
BfTypedValue LookupField(BfAstNode* targetSrc, BfTypedValue target, const StringImpl& fieldName, BfLookupFieldFlags flags = BfLookupFieldFlag_None);
void CheckObjectCreateTypeRef(BfType* expectingType, BfAstNode* afterNode);
void LookupQualifiedName(BfQualifiedNameNode* nameNode, bool ignoreInitialError = false, bool* hadError = NULL);
void LookupQualifiedName(BfAstNode* nameNode, BfIdentifierNode* nameLeft, BfIdentifierNode* nameRight, bool ignoreInitialError, bool* hadError = NULL);
void LookupQualifiedStaticField(BfQualifiedNameNode* nameNode, bool ignoreIdentifierNotFoundError);
void LookupQualifiedStaticField(BfQualifiedNameNode* nameNode, bool ignoreIdentifierNotFoundError);
void LookupQualifiedStaticField(BfAstNode* nameNode, BfIdentifierNode* nameLeft, BfIdentifierNode* nameRight, bool ignoreIdentifierNotFoundError);
bool CheckConstCompare(BfBinaryOp binaryOp, BfAstNode* opToken, const BfTypedValue& leftValue, const BfTypedValue& rightValue);
void AddStrings(const BfTypedValue& leftValue, const BfTypedValue& rightValue, BfAstNode* refNode);
@ -489,41 +488,41 @@ public:
void SplatArgs(BfTypedValue value, SizedArrayImpl<BfIRValue>& irArgs);
void PushArg(BfTypedValue argVal, SizedArrayImpl<BfIRValue>& irArgs, bool disableSplat = false, bool disableLowering = false, bool isIntrinsic = false, bool createCompositeCopy = false);
void PushThis(BfAstNode* targetSrc, BfTypedValue callTarget, BfMethodInstance* methodInstance, SizedArrayImpl<BfIRValue>& irArgs, bool skipMutCheck = false);
BfTypedValue MatchConstructor(BfAstNode* targetSrc, BfMethodBoundExpression* methodBoundExpr, BfTypedValue target, BfTypeInstance* targetType,
BfTypedValue MatchConstructor(BfAstNode* targetSrc, BfMethodBoundExpression* methodBoundExpr, BfTypedValue target, BfTypeInstance* targetType,
BfResolvedArgs& argValues, bool callCtorBodyOnly, bool allowAppendAlloc, BfTypedValue* appendIndexValue = NULL);
BfTypedValue CheckEnumCreation(BfAstNode* targetSrc, BfTypeInstance* enumType, const StringImpl& caseName, BfResolvedArgs& argValues);
BfTypedValue MatchMethod(BfAstNode* targetSrc, BfMethodBoundExpression* methodBoundExpr, BfTypedValue target, bool allowImplicitThis, bool bypassVirtual, const StringImpl& name,
BfTypedValue MatchMethod(BfAstNode* targetSrc, BfMethodBoundExpression* methodBoundExpr, BfTypedValue target, bool allowImplicitThis, bool bypassVirtual, const StringImpl& name,
BfResolvedArgs& argValue, const BfMethodGenericArguments& methodGenericArguments, BfCheckedKind checkedKind = BfCheckedKind_NotSet);
BfTypedValue MakeCallableTarget(BfAstNode* targetSrc, BfTypedValue target);
BfTypedValue MakeCallableTarget(BfAstNode* targetSrc, BfTypedValue target);
BfModuleMethodInstance GetSelectedMethod(BfAstNode* targetSrc, BfTypeInstance* curTypeInst, BfMethodDef* methodDef, BfMethodMatcher& methodMatcher, BfType** overrideReturnType = NULL);
BfModuleMethodInstance GetSelectedMethod(BfMethodMatcher& methodMatcher);
bool CheckVariableDeclaration(BfAstNode* checkNode, bool requireSimpleIfExpr, bool exprMustBeTrue, bool silentFail);
bool HasVariableDeclaration(BfAstNode* checkNode);
void DoInvocation(BfAstNode* target, BfMethodBoundExpression* methodBoundExpr, const BfSizedArray<BfExpression*>& args, const BfMethodGenericArguments& methodGenericArgs, BfTypedValue* outCascadeValue = NULL);
int GetMixinVariable();
void DoInvocation(BfAstNode* target, BfMethodBoundExpression* methodBoundExpr, const BfSizedArray<BfExpression*>& args, const BfMethodGenericArguments& methodGenericArgs, BfTypedValue* outCascadeValue = NULL);
int GetMixinVariable();
void CheckLocalMethods(BfAstNode* targetSrc, BfTypeInstance* typeInstance, const StringImpl& methodName, BfMethodMatcher& methodMatcher, BfMethodType methodType);
void InjectMixin(BfAstNode* targetSrc, BfTypedValue target, bool allowImplicitThis, const StringImpl& name, const BfSizedArray<BfExpression*>& arguments, const BfMethodGenericArguments& methodGenericArgs);
void SetMethodElementType(BfAstNode* target);
BfTypedValue DoImplicitArgCapture(BfAstNode* refNode, BfIdentifierNode* identifierNode, int shadowIdx);
BfTypedValue DoImplicitArgCapture(BfAstNode* refNode, BfMethodInstance* methodInstance, int paramIdx, bool& failed, BfImplicitParamKind paramKind = BfImplicitParamKind_General, const BfTypedValue& methodRefTarget = BfTypedValue());
bool CanBindDelegate(BfDelegateBindExpression* delegateBindExpr, BfMethodInstance** boundMethod = NULL, BfType* origMethodExpectingType = NULL, BfTypeVector* methodGenericArgumentsSubstitute = NULL);
bool IsExactMethodMatch(BfMethodInstance* methodA, BfMethodInstance* methodB, bool ignoreImplicitParams = false);
BfTypeInstance* VerifyBaseDelegateType(BfTypeInstance* delegateType);
bool IsExactMethodMatch(BfMethodInstance* methodA, BfMethodInstance* methodB, bool ignoreImplicitParams = false);
BfTypeInstance* VerifyBaseDelegateType(BfTypeInstance* delegateType);
void ConstResolve(BfExpression* expr);
void ProcessArrayInitializer(BfTokenNode* openToken, const BfSizedArray<BfExpression*>& values, const BfSizedArray<BfTokenNode*>& commas, BfTokenNode* closeToken, int dimensions, SizedArrayImpl<int64>& dimLengths, int dim, bool& hasFailed);
BfLambdaInstance* GetLambdaInstance(BfLambdaBindExpression* lambdaBindExpr, BfAllocTarget& allocTarget);
void VisitLambdaBodies(BfAstNode* body, BfFieldDtorDeclaration* fieldDtor);
void FixitAddMember(BfTypeInstance* typeInst, BfType* fieldType, const StringImpl& fieldName, bool isStatic);
void VisitLambdaBodies(BfAstNode* body, BfFieldDtorDeclaration* fieldDtor);
void FixitAddMember(BfTypeInstance* typeInst, BfType* fieldType, const StringImpl& fieldName, bool isStatic);
BfTypedValue TryArrowLookup(BfTypedValue typedValue, BfTokenNode* arrowToken);
void PerformUnaryOperation(BfExpression* unaryOpExpr, BfUnaryOp unaryOp, BfTokenNode* opToken, BfUnaryOpFlags opFlags);
BfTypedValue PerformUnaryOperation_TryOperator(const BfTypedValue& inValue, BfExpression* unaryOpExpr, BfUnaryOp unaryOp, BfTokenNode* opToken, BfUnaryOpFlags opFlags);
void PerformUnaryOperation_OnResult(BfExpression* unaryOpExpr, BfUnaryOp unaryOp, BfTokenNode* opToken, BfUnaryOpFlags opFlags);
BfTypedValue PerformAssignment_CheckOp(BfAssignmentExpression* assignExpr, bool deferBinop, BfTypedValue& leftValue, BfTypedValue& rightValue, bool& evaluatedRight);
void PerformAssignment(BfAssignmentExpression* assignExpr, bool evaluatedLeft, BfTypedValue rightValue, BfTypedValue* outCascadeValue = NULL);
void PerformUnaryOperation_OnResult(BfExpression* unaryOpExpr, BfUnaryOp unaryOp, BfTokenNode* opToken, BfUnaryOpFlags opFlags);
BfTypedValue PerformAssignment_CheckOp(BfAssignmentExpression* assignExpr, bool deferBinop, BfTypedValue& leftValue, BfTypedValue& rightValue, bool& evaluatedRight);
void PerformAssignment(BfAssignmentExpression* assignExpr, bool evaluatedLeft, BfTypedValue rightValue, BfTypedValue* outCascadeValue = NULL);
void PopulateDeferrredTupleAssignData(BfTupleExpression* tupleExr, DeferredTupleAssignData& deferredTupleAssignData);
void AssignDeferrredTupleAssignData(BfAssignmentExpression* assignExpr, DeferredTupleAssignData& deferredTupleAssignData, BfTypedValue rightValue);
void DoTupleAssignment(BfAssignmentExpression* assignExpr);
void FinishDeferredEvals(SizedArrayImpl<BfResolvedArg>& argValues);
void DoTupleAssignment(BfAssignmentExpression* assignExpr);
void FinishDeferredEvals(SizedArrayImpl<BfResolvedArg>& argValues);
void FinishDeferredEvals(BfResolvedArgs& argValues);
bool LookupTypeProp(BfTypeOfExpression* typeOfExpr, BfIdentifierNode* propName);
void DoTypeIntAttr(BfTypeReference* typeRef, BfTokenNode* commaToken, BfIdentifierNode* memberName, BfToken token);
@ -534,7 +533,7 @@ public:
void CreateObject(BfObjectCreateExpression* objCreateExpr, BfAstNode* allocNode, BfType* allocType);
//////////////////////////////////////////////////////////////////////////
virtual void Visit(BfErrorNode* errorNode) override;
virtual void Visit(BfTypeReference* typeRef) override;
virtual void Visit(BfAttributedExpression* attribExpr) override;
@ -543,7 +542,7 @@ public:
virtual void Visit(BfVariableDeclaration* varDecl) override;
virtual void Visit(BfCaseExpression* caseExpr) override;
virtual void Visit(BfTypedValueExpression* typedValueExpr) override;
virtual void Visit(BfLiteralExpression* literalExpr) override;
virtual void Visit(BfLiteralExpression* literalExpr) override;
virtual void Visit(BfStringInterpolationExpression* stringInterpolationExpression) override;
virtual void Visit(BfIdentifierNode* identifierNode) override;
virtual void Visit(BfAttributedIdentifierNode* attrIdentifierNode) override;
@ -553,7 +552,7 @@ public:
virtual void Visit(BfMixinExpression* mixinExpr) override;
virtual void Visit(BfSizedArrayCreateExpression* createExpr) override;
virtual void Visit(BfInitializerExpression* initExpr) override;
virtual void Visit(BfCollectionInitializerExpression* initExpr) override;
virtual void Visit(BfCollectionInitializerExpression* initExpr) override;
virtual void Visit(BfTypeOfExpression* typeOfExpr) override;
virtual void Visit(BfSizeOfExpression* sizeOfExpr) override;
virtual void Visit(BfAlignOfExpression* alignOfExpr) override;
@ -570,7 +569,7 @@ public:
virtual void Visit(BfLambdaBindExpression* lambdaBindExpr) override;
virtual void Visit(BfObjectCreateExpression* objCreateExpr) override;
virtual void Visit(BfBoxExpression* boxExpr) override;
virtual void Visit(BfInvocationExpression* invocationExpr) override;
virtual void Visit(BfInvocationExpression* invocationExpr) override;
virtual void Visit(BfConditionalExpression* condExpr) override;
virtual void Visit(BfAssignmentExpression* assignExpr) override;
virtual void Visit(BfParenthesizedExpression* parenExpr) override;
@ -578,7 +577,7 @@ public:
virtual void Visit(BfMemberReferenceExpression* memberRefExpr) override;
virtual void Visit(BfIndexerExpression* indexerExpr) override;
virtual void Visit(BfUnaryOperatorExpression* unaryOpExpr) override;
virtual void Visit(BfBinaryOperatorExpression* binOpExpr) override;
virtual void Visit(BfBinaryOperatorExpression* binOpExpr) override;
};
NS_BF_END

View file

@ -19,7 +19,7 @@ public:
{
idx++;
break;
}
}
idx++;
}
return idx;
@ -37,10 +37,10 @@ public:
{
char c = source->mSrc[idx];
if (c == '\n')
{
{
idx++;
break;
}
}
idx--;
}
return idx;
@ -67,13 +67,13 @@ public:
virtual void Visit(BfUsingDirective* usingDirective) override
{
mLastIdx = FindLineStartAfter(usingDirective->GetSourceData(), usingDirective->GetSrcEnd());
mLastIdx = FindLineStartAfter(usingDirective->GetSourceData(), usingDirective->GetSrcEnd());
}
virtual void Visit(BfNamespaceDeclaration* namespaceDecl) override
{
if (mFromIdx != -1)
{
{
if ((mFromIdx < namespaceDecl->mSrcStart) || (mFromIdx >= namespaceDecl->mSrcEnd))
{
// Not inside

File diff suppressed because it is too large Load diff

View file

@ -60,16 +60,16 @@ public:
mCurSrcPos = 0;
mCurLine = 0;
mCurColumn = 0;
}
}
};
enum BfTypeCode : uint8
{
{
BfTypeCode_None,
BfTypeCode_CharPtr,
BfTypeCode_StringId,
BfTypeCode_Pointer,
BfTypeCode_NullPtr,
BfTypeCode_NullPtr,
BfTypeCode_Self,
BfTypeCode_Dot,
BfTypeCode_Var,
@ -123,7 +123,7 @@ enum BfTypeCode : uint8
enum BfConstType
{
BfConstType_GlobalVar = BfTypeCode_Length,
BfConstType_GlobalVar = BfTypeCode_Length,
BfConstType_BitCast,
BfConstType_BitCastNull,
BfConstType_GEP32_1,
@ -145,13 +145,13 @@ enum BfConstType
enum BfIRValueFlags : uint8
{
BfIRValueFlags_None,
BfIRValueFlags_None,
BfIRValueFlags_Value = 1,
BfIRValueFlags_Arg = 2,
BfIRValueFlags_Const = 4,
BfIRValueFlags_FromLLVM = 8,
BfIRValueFlags_Block = 16,
BfIRValueFlags_Func = 32
BfIRValueFlags_Func = 32
};
enum BfIRCmd : uint8
@ -162,7 +162,7 @@ enum BfIRCmd : uint8
BfIRCmd_WriteIR,
BfIRCmd_SetType,
BfIRCmd_SetInstType,
BfIRCmd_SetInstType,
BfIRCmd_PrimitiveType,
BfIRCmd_CreateAnonymousStruct,
BfIRCmd_CreateStruct,
@ -175,7 +175,7 @@ enum BfIRCmd : uint8
BfIRCmd_GetPointerToType,
BfIRCmd_GetSizedArrayType,
BfIRCmd_GetVectorType,
BfIRCmd_CreateConstStructZero,
BfIRCmd_CreateConstAgg,
BfIRCmd_CreateConstArrayZero,
@ -228,10 +228,10 @@ enum BfIRCmd : uint8
BfIRCmd_SetAllocaNoChkStkHint,
BfIRCmd_SetAllocaForceMem,
BfIRCmd_AliasValue,
BfIRCmd_LifetimeStart,
BfIRCmd_LifetimeStart,
BfIRCmd_LifetimeEnd,
BfIRCmd_LifetimeSoftEnd,
BfIRCmd_LifetimeExtend,
BfIRCmd_LifetimeExtend,
BfIRCmd_ValueScopeStart,
BfIRCmd_ValueScopeRetain,
BfIRCmd_ValueScopeSoftEnd,
@ -255,9 +255,9 @@ enum BfIRCmd : uint8
BfIRCmd_CreateBlock,
BfIRCmd_MaybeChainNewBlock,
BfIRCmd_AddBlock,
BfIRCmd_AddBlock,
BfIRCmd_DropBlocks,
BfIRCmd_MergeBlockDown,
BfIRCmd_MergeBlockDown,
BfIRCmd_GetInsertBlock,
BfIRCmd_SetInsertPoint,
BfIRCmd_SetInsertPointAtStart,
@ -276,9 +276,9 @@ enum BfIRCmd : uint8
BfIRCmd_CreatePhi,
BfIRCmd_AddPhiIncoming,
BfIRCmd_GetIntrinsic,
BfIRCmd_CreateFunctionType,
BfIRCmd_CreateFunction,
BfIRCmd_GetIntrinsic,
BfIRCmd_CreateFunctionType,
BfIRCmd_CreateFunction,
BfIRCmd_SetFunctionName,
BfIRCmd_EnsureFunctionPatchable,
BfIRCmd_RemapBindFunction,
@ -293,10 +293,10 @@ enum BfIRCmd : uint8
BfIRCmd_CreateRetVoid,
BfIRCmd_CreateUnreachable,
BfIRCmd_Call_AddAttribute,
BfIRCmd_Call_AddAttribute1,
BfIRCmd_Call_AddAttribute1,
BfIRCmd_Func_AddAttribute,
BfIRCmd_Func_AddAttribute1,
BfIRCmd_Func_SetParamName,
BfIRCmd_Func_SetParamName,
BfIRCmd_Func_DeleteBody,
BfIRCmd_Func_SafeRename,
BfIRCmd_Func_SafeRenameFrom,
@ -385,7 +385,7 @@ enum BfIRParamType : uint8
BfIRParamType_Arg,
BfIRParamType_StreamId_Abs8,
BfIRParamType_StreamId_Rel,
BfIRParamType_StreamId_Back1,
BfIRParamType_StreamId_Back1,
BfIRParamType_StreamId_Back_LAST = 0xFF, // Use remaining encoding
};
@ -425,9 +425,9 @@ enum BfIRIntrinsic : uint8
BfIRIntrinsic_AtomicAnd,
BfIRIntrinsic_AtomicCmpStore,
BfIRIntrinsic_AtomicCmpStore_Weak,
BfIRIntrinsic_AtomicCmpXChg,
BfIRIntrinsic_AtomicCmpXChg,
BfIRIntrinsic_AtomicFence,
BfIRIntrinsic_AtomicLoad,
BfIRIntrinsic_AtomicLoad,
BfIRIntrinsic_AtomicMax,
BfIRIntrinsic_AtomicMin,
BfIRIntrinsic_AtomicNAnd,
@ -440,14 +440,14 @@ enum BfIRIntrinsic : uint8
BfIRIntrinsic_AtomicXor,
BfIRIntrinsic_BSwap,
BfIRIntrinsic_Cast,
BfIRIntrinsic_Cos,
BfIRIntrinsic_Cos,
BfIRIntrinsic_DebugTrap,
BfIRIntrinsic_Div,
BfIRIntrinsic_Eq,
BfIRIntrinsic_Floor,
BfIRIntrinsic_Free,
BfIRIntrinsic_Free,
BfIRIntrinsic_Gt,
BfIRIntrinsic_GtE,
BfIRIntrinsic_GtE,
BfIRIntrinsic_Index,
BfIRIntrinsic_Log,
BfIRIntrinsic_Log10,
@ -459,7 +459,7 @@ enum BfIRIntrinsic : uint8
BfIRIntrinsic_MemMove,
BfIRIntrinsic_MemSet,
BfIRIntrinsic_Mod,
BfIRIntrinsic_Mul,
BfIRIntrinsic_Mul,
BfIRIntrinsic_Neq,
BfIRIntrinsic_Not,
BfIRIntrinsic_Or,
@ -472,8 +472,8 @@ enum BfIRIntrinsic : uint8
BfIRIntrinsic_SHR,
BfIRIntrinsic_Shuffle,
BfIRIntrinsic_Sin,
BfIRIntrinsic_Sqrt,
BfIRIntrinsic_Sub,
BfIRIntrinsic_Sqrt,
BfIRIntrinsic_Sub,
BfIRIntrinsic_VAArg,
BfIRIntrinsic_VAEnd,
BfIRIntrinsic_VAStart,
@ -537,7 +537,7 @@ public:
ID_IMPLICIT = -3
};
public:
public:
int mId;
BfIRValueFlags mFlags;
static BfIRValue sValueless;
@ -548,7 +548,7 @@ public:
public:
BfIRValue()
{
{
mId = -1;
mFlags = BfIRValueFlags_None;
#ifdef CHECK_CONSTHOLDER
@ -557,7 +557,7 @@ public:
}
BfIRValue(const BfIRValue& from)
{
{
mFlags = from.mFlags;
mId = from.mId;
#ifdef CHECK_CONSTHOLDER
@ -566,23 +566,23 @@ public:
}
BfIRValue(BfIRValueFlags flags, int id)
{
{
mFlags = flags;
mId = id;
mId = id;
}
operator bool() const
{
{
return mFlags != BfIRValueFlags_None;
}
}
bool IsFake() const;
bool IsConst() const;
bool IsArg() const;
bool IsArg() const;
bool IsFromLLVM() const;
bool operator==(const BfIRValue& rhs) const
{
{
if (mFlags != rhs.mFlags)
return false;
if (mId != rhs.mId)
@ -591,7 +591,7 @@ public:
}
bool operator!=(const BfIRValue& rhs) const
{
{
if (mFlags != rhs.mFlags)
return true;
if (mId != rhs.mId)
@ -608,7 +608,7 @@ struct BfIRTypeData
TypeKind_TypeId,
TypeKind_TypeCode,
TypeKind_TypeInstId,
TypeKind_TypeInstPtrId,
TypeKind_TypeInstPtrId,
TypeKind_Stream,
TypeKind_SizedArray
};
@ -624,12 +624,12 @@ struct BfIRTypeData
struct BfIRType : public BfIRTypeData
{
public:
public:
BfIRType()
{
mKind = TypeKind_None;
mId = -1;
}
}
BfIRType(BfIRTypeData typeData)
{
@ -637,17 +637,17 @@ public:
mId = typeData.mId;
}
BfIRType(const BfIRValue& val) { mKind = TypeKind_Stream; mId = val.mId; }
BfIRType(const BfIRValue& val) { mKind = TypeKind_Stream; mId = val.mId; }
};
struct BfIRBlock : public BfIRValue
{
public:
public:
BfIRBlock();
BfIRBlock(const BfIRValue& fromVal) : BfIRValue(fromVal) {}
BfIRBlock(const BfIRValue& fromVal) : BfIRValue(fromVal) {}
};
enum BfIRAttribute
enum BfIRAttribute
{
BfIRAttribute_NoReturn,
BfIRAttribute_NoAlias,
@ -670,83 +670,83 @@ enum BfIRAttribute
struct BfIRFunctionType
{
public:
int mId;
public:
int mId;
public:
public:
BfIRFunctionType();
BfIRFunctionType(const BfIRValue& val) { mId = val.mId; }
BfIRFunctionType(const BfIRValue& val) { mId = val.mId; }
operator bool() const
{
return mId != -1;
}
}
};
struct BfIRFunction : public BfIRRawValue
{
public:
public:
BfIRFunction();
BfIRFunction(const BfIRValue& val)
{
BF_ASSERT((val.mFlags == BfIRValueFlags_None) || (val.mFlags == BfIRValueFlags_Value));
mId = val.mId;
}
}
//: BfIRValue(val) {}
bool operator==(const BfIRFunction& rhs) const
{
{
if (mId != rhs.mId)
return false;
return true;
}
bool operator!=(const BfIRFunction& rhs) const
{
{
if (mId == rhs.mId)
return false;
return true;
}
operator bool() const
{
{
return mId != -1;
}
operator BfIRValue() const
{
{
return BfIRValue((mId == -1) ? BfIRValueFlags_None : BfIRValueFlags_Value, mId);
}
};
struct BfIRMDNode
{
public:
public:
int mId;
BfIRMDNode()
{
{
mId = -1;
}
BfIRMDNode(const BfIRValue& val)
{
{
mId = val.mId;
}
operator bool() const
{
{
return mId != -1;
}
}
bool operator==(const BfIRMDNode& rhs) const
{
{
if (mId != rhs.mId)
return false;
return true;
}
bool operator!=(const BfIRMDNode& rhs) const
{
{
if (mId == rhs.mId)
return false;
return true;
@ -763,7 +763,7 @@ public:
public:
BfFileInstance()
{
mParser = NULL;
mParser = NULL;
}
};
@ -776,7 +776,7 @@ struct BfGlobalVar
BfIRLinkageType mLinkageType;
int mStreamId;
BfIRValue mInitializer;
bool mIsTLS;
bool mIsTLS;
int mAlignment;
};
@ -789,7 +789,7 @@ struct BfGlobalVar_TypeInst
BfIRLinkageType mLinkageType;
int mStreamId;
BfIRValue mInitializer;
bool mIsTLS;
bool mIsTLS;
};
struct BfTypeOf_Const
@ -813,7 +813,7 @@ public:
{
BfTypeCode mTypeCode;
BfConstType mConstType;
};
};
union
{
bool mBool;
@ -886,7 +886,7 @@ struct BfConstantGEP32_1
{
BfConstType mConstType;
int mTarget;
int mIdx0;
int mIdx0;
};
struct BfConstantGEP32_2
@ -901,7 +901,7 @@ struct BfConstantExtractValue
{
BfConstType mConstType;
int mTarget;
int mIdx0;
int mIdx0;
};
struct BfConstantAgg
@ -931,15 +931,15 @@ public:
BumpAllocatorT<256> mTempAlloc;
BfModule* mModule;
Dictionary<String, BfIRValue> mGlobalVarMap;
public:
void FixTypeCode(BfTypeCode& typeCode);
int GetSize(BfTypeCode typeCode);
static int GetSize(BfTypeCode typeCode, int ptrSize);
static bool IsInt(BfTypeCode typeCode);
static bool IsInt(BfTypeCode typeCode);
static bool IsChar(BfTypeCode typeCode);
static bool IsIntable(BfTypeCode typeCode);
static bool IsSigned(BfTypeCode typeCode);
static bool IsSigned(BfTypeCode typeCode);
static bool IsFloat(BfTypeCode typeCode);
const char* AllocStr(const StringImpl& str);
@ -951,7 +951,7 @@ public:
String ToString(BfIRType irType);
void pv(const BfIRValue& irValue);
BfConstant* GetConstantById(int id);
BfConstant* GetConstantById(int id);
BfConstant* GetConstant(BfIRValue id);
bool TryGetBool(BfIRValue id, bool& boolVal);
int IsZero(BfIRValue val);
@ -961,7 +961,7 @@ public:
BfIRType GetSizedArrayType(BfIRType elementType, int length);
BfIRValue CreateConst(BfTypeCode typeCode, uint64 val);
BfIRValue CreateConst(BfTypeCode typeCode, uint64 val);
BfIRValue CreateConst(BfTypeCode typeCode, int val);
BfIRValue CreateConst(BfTypeCode typeCode, double val);
BfIRValue CreateConst(BfConstant* fromConst, BfIRConstHolder* fromHolder);
@ -976,11 +976,11 @@ public:
BfIRValue CreateConstBox(BfIRValue val, BfIRType type);
BfIRValue CreateTypeOf(BfType* type);
BfIRValue CreateTypeOf(BfType* type, BfIRValue typeData);
BfIRValue GetUndefConstValue(BfIRType type);
BfIRValue GetUndefConstValue(BfIRType type);
BfIRValue CreateGlobalVariableConstant(BfIRType varType, bool isConstant, BfIRLinkageType linkageType, BfIRValue initializer, const StringImpl& name, bool isTLS = false);
bool WriteConstant(BfIRValue val, void* ptr, BfType* type);
BfIRValue ReadConstant(void* ptr, BfType* type);
BfIRValue ReadConstant(void* ptr, BfType* type);
};
enum BfIRPopulateType
@ -1011,16 +1011,16 @@ enum BfOverflowCheckKind : int8
class BfIRBuilder : public BfIRConstHolder
{
public:
public:
bool mIgnoreWrites;
bool mDbgVerifyCodeGen;
int mCurFakeId;
bool mHasGlobalDefs;
bool mIsBeefBackend;
int mNumFunctionsWithBodies;
int mNumFunctionsWithBodies;
int mBlockCount;
bool mHasStarted;
int mCmdCount;
bool mHasStarted;
int mCmdCount;
ChunkedDataBuffer mStream;
BfIRBlock mActualInsertBlock; // Only when not ignoring writes
@ -1032,12 +1032,12 @@ public:
Dictionary<StringView, BfIRFunction> mFunctionMap;
Dictionary<BfType*, BfIRPopulateType> mTypeMap;
Dictionary<int, BfIRValue> mConstMemMap;
Array<BfTypeInstance*> mDITemporaryTypes;
Array<BfTypeInstance*> mDITemporaryTypes;
BfIRFunction mActiveFunction;
bool mActiveFunctionHasBody;
Array<BfFilePosition> mSavedDebugLocs;
Array<BfType*> mDeferredDbgTypeDefs;
BfIRCodeGenBase* mIRCodeGen;
BfIRCodeGen* mBfIRCodeGen;
BeIRCodeGen* mBeIRCodeGen;
@ -1050,7 +1050,7 @@ public:
public:
~BfIRBuilder();
void WriteSLEB128(int64 val);
void WriteSLEB128(int32 val);
void Write(uint8 val);
@ -1061,24 +1061,24 @@ public:
void Write(const StringImpl& str);
void Write(const BfIRValue& irValue);
void Write(BfTypeCode typeCode);
void Write(const BfIRTypeData& type);
void Write(const BfIRTypeData& type);
void Write(BfIRFunctionType func);
void Write(BfIRFunction funcType);
void Write(BfIRBlock block);
void Write(BfIRMDNode node);
void Write(BfIRMDNode node);
template <typename T>
void Write(const BfSizedArray<T>& sizedArray)
{
WriteSLEB128(sizedArray.mSize);
WriteSLEB128(sizedArray.mSize);
for (int i = 0; i < sizedArray.mSize; i++)
Write(sizedArray.mVals[i]);
}
BfIRValue WriteCmd(BfIRCmd cmd);
}
BfIRValue WriteCmd(BfIRCmd cmd);
template <typename T>
void WriteArg(const T& first)
{
Write(first);
Write(first);
}
template <typename T, typename... Args>
@ -1090,17 +1090,17 @@ public:
template <typename... Args>
BfIRValue WriteCmd(BfIRCmd cmd, const Args&... args)
{
{
if (mIgnoreWrites)
return GetFakeVal();
//int dataPos = mStream.GetSize();
auto result = WriteCmd(cmd);
WriteArg(args...);
auto result = WriteCmd(cmd);
WriteArg(args...);
return result;
//return BfIRValue(BfIRValueFlags_Value, dataPos);
}
public:
public:
void NewCmdInserted();
BfIRMDNode CreateNamespaceScope(BfType* type, BfIRMDNode fileDIScope);
String GetDebugTypeName(BfTypeInstance* typeInstance, bool includeOuterTypeName);
@ -1114,18 +1114,18 @@ public:
BfIRPopulateType GetPopulateTypeState(BfType* type);
void PopulateType(BfType* type, BfIRPopulateType populateType = BfIRPopulateType_Full);
void SetType(BfType* type, BfIRType irType);
void SetInstType(BfType* type, BfIRType irType);
void SetInstType(BfType* type, BfIRType irType);
int GetFakeId();
BfIRValue GetFakeVal();
BfIRValue GetFakeConst();
BfIRType GetFakeType();
BfIRType GetFakeBlock();
BfIRFunctionType GetFakeFunctionType();
BfIRFunction GetFakeFunction();
BfIRType GetFakeType();
BfIRType GetFakeBlock();
BfIRFunctionType GetFakeFunctionType();
BfIRFunction GetFakeFunction();
public:
void OpFailed();
uint8 CheckedAdd(uint8 a, uint8 b);
uint16 CheckedAdd(uint16 a, uint16 b);
uint32 CheckedAdd(uint32 a, uint32 b);
@ -1169,7 +1169,7 @@ public:
int64 CheckedShl(int64 a, int64 b);
public:
BfIRBuilder(BfModule* module);
BfIRBuilder(BfModule* module);
bool HasExports(); // Contains non-empty functions and/or non-empty globals
String ToString(BfIRValue irValue);
@ -1183,9 +1183,9 @@ public:
void pt(const BfIRType& irType);
void pbft(BfType* type);
void pt(const BfIRFunction& irFun);
void pft(const BfIRFunctionType& irType);
void pft(const BfIRFunctionType& irType);
void pmd(const BfIRMDNode& irMDNode);
void GetBufferData(Array<uint8>& outBuffer);
void ClearConstData();
void ClearNonConstData();
@ -1194,11 +1194,11 @@ public:
void SetBackend(bool isBeefBackend);
void RemoveIRCodeGen();
void WriteIR(const StringImpl& fileName);
void Module_SetTargetTriple(const StringImpl& targetTriple, const StringImpl& targetCPU);
void Module_AddModuleFlag(const StringImpl& flag, int val);
BfIRType GetPrimitiveType(BfTypeCode typeCode);
BfIRType GetPrimitiveType(BfTypeCode typeCode);
BfIRType CreateStructType(const StringImpl& name);
BfIRType CreateStructType(const BfSizedArray<BfIRType>& memberTypes);
void StructSetBody(BfIRType type, const BfSizedArray<BfIRType>& memberTypes, int size, int align, bool isPacked);
@ -1210,7 +1210,7 @@ public:
BfIRType GetPointerTo(BfIRType type);
BfIRType GetSizedArrayType(BfIRType elementType, int length);
BfIRType GetVectorType(BfIRType elementType, int length);
BfIRValue CreateConstAgg_Value(BfIRType type, const BfSizedArray<BfIRValue>& values);
BfIRValue CreateConstString(const StringImpl& string);
BfIRValue ConstToMemory(BfIRValue constVal);
@ -1252,13 +1252,13 @@ public:
BfIRValue CreateExtractValue(BfIRValue val, int idx);
BfIRValue CreateExtractValue(BfIRValue val, BfIRValue idx);
BfIRValue CreateInsertValue(BfIRValue agg, BfIRValue val, int idx);
BfIRValue CreateAlloca(BfIRType type);
BfIRValue CreateAlloca(BfIRType type, BfIRValue arraySize);
void SetAllocaAlignment(BfIRValue val, int alignment);
// When we do a dynamic alloca where we know the memory access patterns will not cause a page fault, we can omit the __chkstk call
// Generally, this is when we allocate less than 4k and we know there will be a write on this memory before the next alloca
void SetAllocaNoChkStkHint(BfIRValue val);
void SetAllocaNoChkStkHint(BfIRValue val);
void SetAllocaForceMem(BfIRValue val);
BfIRValue CreateAliasValue(BfIRValue val);
BfIRValue CreateLifetimeStart(BfIRValue val);
@ -1277,8 +1277,8 @@ public:
void CreateFence(BfIRFenceType fenceType);
BfIRValue CreateStackSave();
BfIRValue CreateStackRestore(BfIRValue stackVal);
BfIRValue CreateGlobalVariable(BfIRType varType, bool isConstant, BfIRLinkageType linkageType, BfIRValue initializer, const StringImpl& name, bool isTLS = false);
BfIRValue CreateGlobalVariable(BfIRType varType, bool isConstant, BfIRLinkageType linkageType, BfIRValue initializer, const StringImpl& name, bool isTLS = false);
void CreateGlobalVariable(BfIRValue irValue);
void GlobalVar_SetUnnamedAddr(BfIRValue val, bool unnamedAddr);
void GlobalVar_SetInitializer(BfIRValue globalVar, BfIRValue initVal);
@ -1289,32 +1289,32 @@ public:
BfIRBlock CreateBlock(const StringImpl& name, bool addNow = false);
BfIRBlock MaybeChainNewBlock(const StringImpl& name); // Creates new block if current block isn't empty
void AddBlock(BfIRBlock block);
void AddBlock(BfIRBlock block);
void DropBlocks(BfIRBlock block);
void MergeBlockDown(BfIRBlock fromBlock, BfIRBlock intoBlock);
void MergeBlockDown(BfIRBlock fromBlock, BfIRBlock intoBlock);
void SetInsertPoint(BfIRValue value);
void SetInsertPoint(BfIRBlock block);
void SetInsertPointAtStart(BfIRBlock block);
void EraseFromParent(BfIRBlock block);
void EraseFromParent(BfIRBlock block);
void DeleteBlock(BfIRBlock block);
void EraseInstFromParent(BfIRValue val);
BfIRValue CreateBr(BfIRBlock block);
BfIRValue CreateBr_Fake(BfIRBlock block);
BfIRValue CreateBr_NoCollapse(BfIRBlock block);
void CreateCondBr(BfIRValue val, BfIRBlock trueBlock, BfIRBlock falseBlock);
BfIRBlock GetInsertBlock();
void MoveBlockToEnd(BfIRBlock block);
BfIRBlock GetInsertBlock();
void MoveBlockToEnd(BfIRBlock block);
BfIRValue CreateSwitch(BfIRValue value, BfIRBlock dest, int numCases);
BfIRValue AddSwitchCase(BfIRValue switchVal, BfIRValue caseVal, BfIRBlock caseBlock);
void SetSwitchDefaultDest(BfIRValue switchVal, BfIRBlock caseBlock);
BfIRValue CreatePhi(BfIRType type, int incomingCount);
void AddPhiIncoming(BfIRValue phi, BfIRValue value, BfIRBlock comingFrom);
BfIRFunction GetIntrinsic(String intrinName, int intrinId, BfIRType returnType, const BfSizedArray<BfIRType>& paramTypes);
BfIRFunction GetIntrinsic(String intrinName, int intrinId, BfIRType returnType, const BfSizedArray<BfIRType>& paramTypes);
BfIRFunctionType MapMethod(BfMethodInstance* methodInstance);
BfIRFunctionType CreateFunctionType(BfIRType resultType, const BfSizedArray<BfIRType>& paramTypes, bool isVarArg = false);
BfIRFunction CreateFunction(BfIRFunctionType funcType, BfIRLinkageType linkageType, const StringImpl& name);
BfIRFunction CreateFunction(BfIRFunctionType funcType, BfIRLinkageType linkageType, const StringImpl& name);
void SetFunctionName(BfIRValue func, const StringImpl& name);
void EnsureFunctionPatchable();
BfIRValue RemapBindFunction(BfIRValue func);
@ -1328,18 +1328,18 @@ public:
void SetCallAttribute(BfIRValue callInst, int paramIdx, BfIRAttribute attribute);
BfIRValue CreateRet(BfIRValue val);
BfIRValue CreateSetRet(BfIRValue val, int returnTypeId);
void CreateRetVoid();
void CreateRetVoid();
void CreateUnreachable();
void Call_AddAttribute(BfIRValue callInst, int argIdx, BfIRAttribute attr);
void Call_AddAttribute(BfIRValue callInst, int argIdx, BfIRAttribute attr, int arg);
void Call_AddAttribute(BfIRValue callInst, int argIdx, BfIRAttribute attr, int arg);
void Func_AddAttribute(BfIRFunction func, int argIdx, BfIRAttribute attr);
void Func_AddAttribute(BfIRFunction func, int argIdx, BfIRAttribute attr, int arg);
void Func_SetParamName(BfIRFunction func, int argIdx, const StringImpl& name);
void Func_SetParamName(BfIRFunction func, int argIdx, const StringImpl& name);
void Func_DeleteBody(BfIRFunction func);
void Func_SafeRename(BfIRFunction func);
void Func_SafeRenameFrom(BfIRFunction func, const StringImpl& prevName);
void Func_SetLinkage(BfIRFunction func, BfIRLinkageType linkage);
void Comptime_Error(int errorKind);
BfIRValue Comptime_GetBfType(int typeId, BfIRType resultType);
BfIRValue Comptime_GetReflectType(int typeId, BfIRType resultType);
@ -1351,7 +1351,7 @@ public:
void RestoreDebugLocation();
void DupDebugLocation();
bool HasDebugLocation();
void ClearDebugLocation();
void ClearDebugLocation();
void ClearDebugLocation(BfIRValue inst);
void ClearDebugLocation_Last();
void UpdateDebugLocation(BfIRValue inst);
@ -1360,29 +1360,29 @@ public:
void CreateEnsureInstructionAt();
void CreateStatementStart();
void CreateObjectAccessCheck(BfIRValue value, bool useAsm);
void DbgInit();
void DbgFinalize();
void DbgFinalize();
bool DbgHasInfo();
bool DbgHasLineInfo();
String DbgGetStaticFieldName(BfFieldInstance* fieldInstance);
void DbgAddPrefix(String& name);
BfIRMDNode DbgCreateCompileUnit(int lang, const StringImpl& filename, const StringImpl& directory, const StringImpl& producer, bool isOptimized,
const StringImpl& flags, int runtimeVer, bool linesOnly);
BfIRMDNode DbgCreateCompileUnit(int lang, const StringImpl& filename, const StringImpl& directory, const StringImpl& producer, bool isOptimized,
const StringImpl& flags, int runtimeVer, bool linesOnly);
BfIRMDNode DbgCreateFile(const StringImpl& fileName, const StringImpl& directory, const Val128& md5Hash);
BfIRMDNode DbgGetCurrentLocation();
void DbgSetType(BfType * type, BfIRMDNode diType);
void DbgSetInstType(BfType * type, BfIRMDNode diType);
void DbgSetInstType(BfType * type, BfIRMDNode diType);
BfIRMDNode DbgCreateConstValue(int64 val);
BfIRMDNode DbgGetType(BfType* type, BfIRPopulateType populateType = BfIRPopulateType_Declaration);
BfIRMDNode DbgGetType(BfType* type, BfIRPopulateType populateType = BfIRPopulateType_Declaration);
BfIRMDNode DbgGetTypeInst(BfTypeInstance* typeInst, BfIRPopulateType populateType = BfIRPopulateType_Declaration);
void DbgTrackDITypes(BfType* type);
BfIRMDNode DbgCreateNameSpace(BfIRMDNode scope, const StringImpl& name, BfIRMDNode file, int lineNum);
BfIRMDNode DbgCreateImportedModule(BfIRMDNode context, BfIRMDNode namespaceNode, int line);
BfIRMDNode DbgCreateBasicType(const StringImpl& name, int64 sizeInBits, int64 alignInBits, int encoding);
BfIRMDNode DbgCreateStructType(BfIRMDNode context, const StringImpl& name, BfIRMDNode file, int lineNum, int64 sizeInBits, int64 alignInBits,
BfIRMDNode DbgCreateStructType(BfIRMDNode context, const StringImpl& name, BfIRMDNode file, int lineNum, int64 sizeInBits, int64 alignInBits,
int flags, BfIRMDNode derivedFrom, const BfSizedArray<BfIRMDNode>& elements);
BfIRMDNode DbgCreateEnumerationType(BfIRMDNode scope, const StringImpl& name, BfIRMDNode file, int lineNumber, int64 SizeInBits, int64 alignInBits,
BfIRMDNode DbgCreateEnumerationType(BfIRMDNode scope, const StringImpl& name, BfIRMDNode file, int lineNumber, int64 SizeInBits, int64 alignInBits,
const BfSizedArray<BfIRMDNode>& elements, BfIRMDNode underlyingType);
BfIRMDNode DbgCreatePointerType(BfIRMDNode diType);
BfIRMDNode DbgCreateReferenceType(BfIRMDNode diType);
@ -1397,14 +1397,14 @@ public:
void DbgDeleteTemporary(BfIRMDNode diNode);
BfIRMDNode DbgMakePermanent(BfIRMDNode diNode, BfIRMDNode diBaseType, const BfSizedArray<BfIRMDNode>& elements);
BfIRMDNode DbgCreateEnumerator(const StringImpl& name, int64 val);
BfIRMDNode DbgCreateMemberType(BfIRMDNode scope, const StringImpl& name, BfIRMDNode file, int lineNumber, int64 sizeInBits, int64 alignInBits,
BfIRMDNode DbgCreateMemberType(BfIRMDNode scope, const StringImpl& name, BfIRMDNode file, int lineNumber, int64 sizeInBits, int64 alignInBits,
int64 offsetInBits, int flags, BfIRMDNode type);
BfIRMDNode DbgCreateStaticMemberType(BfIRMDNode scope, const StringImpl& name, BfIRMDNode file, int lineNumber, BfIRMDNode type, int flags, BfIRValue val);
BfIRMDNode DbgCreateInheritance(BfIRMDNode type, BfIRMDNode baseType, int64 baseOffset, int flags);
BfIRMDNode DbgCreateMethod(BfIRMDNode context, const StringImpl& name, const StringImpl& linkageName, BfIRMDNode file, int lineNum, BfIRMDNode type,
bool isLocalToUnit, bool isDefinition, int vk, int vIndex, BfIRMDNode vTableHolder, int flags, bool isOptimized, BfIRValue fn,
bool isLocalToUnit, bool isDefinition, int vk, int vIndex, BfIRMDNode vTableHolder, int flags, bool isOptimized, BfIRValue fn,
const BfSizedArray<BfIRMDNode>& genericArgs, const BfSizedArray<BfIRValue>& genericConstValueArgs);
BfIRMDNode DbgCreateFunction(BfIRMDNode context, const StringImpl& name, const StringImpl& linkageName, BfIRMDNode file, int lineNum, BfIRMDNode type,
BfIRMDNode DbgCreateFunction(BfIRMDNode context, const StringImpl& name, const StringImpl& linkageName, BfIRMDNode file, int lineNum, BfIRMDNode type,
bool isLocalToUnit, bool isDefinition, int scopeLine, int flags, bool isOptimized, BfIRValue fn);
BfIRMDNode DbgCreateParameterVariable(BfIRMDNode scope, const StringImpl& name, int argNo, BfIRMDNode file, int lineNum, BfIRMDNode type,
bool AlwaysPreserve = false, int flags = 0);
@ -1414,14 +1414,13 @@ public:
BfIRValue DbgInsertValueIntrinsic(BfIRValue val, BfIRMDNode varInfo);
BfIRValue DbgInsertDeclare(BfIRValue val, BfIRMDNode varInfo, BfIRValue declareBefore = BfIRValue());
BfIRValue DbgLifetimeEnd(BfIRMDNode varInfo);
void DbgCreateGlobalVariable(BfIRMDNode context, const StringImpl& name, const StringImpl& linkageName, BfIRMDNode file, int lineNumber,
void DbgCreateGlobalVariable(BfIRMDNode context, const StringImpl& name, const StringImpl& linkageName, BfIRMDNode file, int lineNumber,
BfIRMDNode type, bool isLocalToUnit, BfIRValue val, BfIRMDNode Decl = BfIRMDNode());
BfIRMDNode DbgCreateLexicalBlock(BfIRMDNode scope, BfIRMDNode file, int line, int col);
void DbgCreateAnnotation(BfIRMDNode scope, const StringImpl& name, BfIRValue value);
BfIRMDNode DbgCreateLexicalBlock(BfIRMDNode scope, BfIRMDNode file, int line, int col);
void DbgCreateAnnotation(BfIRMDNode scope, const StringImpl& name, BfIRValue value);
BfIRState GetState();
void SetState(const BfIRState& state);
};
NS_BF_END

File diff suppressed because it is too large Load diff

View file

@ -20,7 +20,7 @@ namespace llvm
class AttributeList;
class Module;
class LLVMContext;
class TargetMachine;
class TargetMachine;
};
NS_BF_BEGIN
@ -41,7 +41,7 @@ class BfIRIntrinsicData
public:
String mName;
BfIRIntrinsic mIntrinsic;
llvm::Type* mReturnType;
llvm::Type* mReturnType;
};
struct BfIRCodeGenEntry
@ -52,7 +52,7 @@ struct BfIRCodeGenEntry
llvm::Value* mLLVMValue;
llvm::Type* mLLVMType;
llvm::BasicBlock* mLLVMBlock;
llvm::MDNode* mLLVMMetadata;
llvm::MDNode* mLLVMMetadata;
BfIRIntrinsicData* mIntrinsicData;
};
};
@ -67,7 +67,7 @@ public:
llvm::DIType* mInstDIType;
llvm::Type* mLLVMType;
llvm::Type* mAlignLLVMType;
llvm::Type* mInstLLVMType;
llvm::Type* mInstLLVMType;
public:
BfIRTypeEntry()
@ -87,14 +87,14 @@ enum BfIRSizeAlignKind
{
BfIRSizeAlignKind_NoTransform,
BfIRSizeAlignKind_Original,
BfIRSizeAlignKind_Aligned,
BfIRSizeAlignKind_Aligned,
};
class BfIRCodeGen : public BfIRCodeGenBase
{
public:
BfIRBuilder* mBfIRBuilder;
public:
BfIRBuilder* mBfIRBuilder;
BumpAllocator mAlloc;
BfTargetTriple mTargetTriple;
String mTargetCPU;
@ -113,7 +113,7 @@ public:
llvm::InlineAsm* mOverflowCheckAsm;
llvm::DebugLoc mDebugLoc;
BfCodeGenOptions mCodeGenOptions;
bool mHasDebugLoc;
bool mHasDebugLoc;
bool mIsCodeView;
bool mHadDLLExport;
int mConstValIdx;
@ -122,7 +122,7 @@ public:
Dictionary<int, BfIRCodeGenEntry> mResults;
Dictionary<int, BfIRTypeEntry> mTypes;
Dictionary<int, llvm::Function*> mIntrinsicMap;
Dictionary<llvm::Function*, int> mIntrinsicReverseMap;
Dictionary<llvm::Function*, int> mIntrinsicReverseMap;
Array<llvm::Constant*> mConfigConsts32;
Array<llvm::Constant*> mConfigConsts64;
Dictionary<llvm::Type*, llvm::Value*> mReflectDataMap;
@ -131,7 +131,7 @@ public:
HashSet<llvm::BasicBlock*> mLockedBlocks;
OwnedArray<BfIRIntrinsicData> mIntrinsicData;
public:
public:
void InitTarget();
void FixValues(llvm::StructType* structType, llvm::SmallVector<llvm::Value*, 8>& values);
void FixIndexer(llvm::Value*& val);
@ -141,15 +141,15 @@ public:
BfIRTypeEntry* GetTypeEntry(llvm::Type* type);
void SetResult(int id, llvm::Value* value);
void SetResultAligned(int id, llvm::Value* value);
void SetResult(int id, llvm::Type* value);
void SetResult(int id, llvm::Type* value);
void SetResult(int id, llvm::BasicBlock* value);
void SetResult(int id, llvm::MDNode* value);
void SetResult(int id, llvm::MDNode* value);
void CreateMemSet(llvm::Value* addr, llvm::Value* val, llvm::Value* size, int alignment, bool isVolatile = false);
void AddNop();
llvm::Value* TryToVector(llvm::Value* value);
llvm::Value* TryToVector(llvm::Value* value, llvm::Type* elemType);
llvm::Type* GetElemType(llvm::Value* value);
bool TryMemCpy(llvm::Value* ptr, llvm::Value* val);
bool TryMemCpy(llvm::Value* ptr, llvm::Value* val);
bool TryVectorCpy(llvm::Value* ptr, llvm::Value* val);
llvm::Type* GetSizeAlignedType(BfIRTypeEntry* typeEntry);
llvm::Value* GetAlignedPtr(llvm::Value* val);
@ -168,7 +168,7 @@ public:
void PrintFunction();
int64 ReadSLEB128();
void Read(StringImpl& str);
void Read(StringImpl& str);
void Read(int& i);
void Read(int64& i);
void Read(Val128& i);
@ -227,14 +227,14 @@ public:
llvm::BasicBlock* GetLLVMBlock(int streamId);
llvm::MDNode* GetLLVMMetadata(int streamId);
llvm::Type* GetLLVMTypeById(int id);
llvm::Type* GetLLVMTypeById(int id);
///
bool WriteObjectFile(const StringImpl& outFileName);
bool WriteIR(const StringImpl& outFileName, StringImpl& error);
static int GetIntrinsicId(const StringImpl& name);
static int GetIntrinsicId(const StringImpl& name);
static const char* GetIntrinsicName(int intrinId);
static void SetAsmKind(BfAsmKind asmKind);
@ -242,4 +242,3 @@ public:
};
NS_BF_END

File diff suppressed because it is too large Load diff

View file

@ -33,7 +33,7 @@ public:
Kind_MethodName,
Kind_Prefix,
Kind_PrimitivePrefix,
Kind_GenericParam
Kind_GenericParam
};
public:
@ -54,7 +54,7 @@ public:
BfTypeInstance* mTypeInst;
BfMethodInstance* mMethodInstance;
const char* mPrefix;
};
};
public:
NameSubstitute(Kind kind, void* param)
@ -90,7 +90,7 @@ public:
class BfGNUMangler : public BfMangler
{
public:
public:
class MangleContext
{
public:
@ -111,22 +111,22 @@ public:
mPrefixObjectPointer = false;
}
};
static int ParseSubIdx(StringImpl& name, int strIdx);
static void AddSubIdx(StringImpl& name, int strIdx);
static void AddSizedString(StringImpl& name, const StringImpl& addStr);
static BfTypeCode GetPrimTypeAt(MangleContext& mangleContext, StringImpl& name, int strIdx);
static void AddPrefix(MangleContext& mangleContext, StringImpl& name, int startIdx, const char* prefix);
static void AddPrefix(MangleContext& mangleContext, StringImpl& name, int startIdx, const char* prefix);
static void FindOrCreateNameSub(MangleContext& mangleContext, StringImpl& name, const NameSubstitute& newNameSub, int& curMatchIdx, bool& matchFailed);
static void FindOrCreateNameSub(MangleContext& mangleContext, StringImpl& name, BfTypeInstance* typeInst, int& curMatchIdx, bool& matchFailed);
static void FindOrCreateNameSub(MangleContext& mangleContext, StringImpl& name, const NameSubstitute& newNameSub);
static void FindOrCreateNameSub(MangleContext& mangleContext, StringImpl& name, const NameSubstitute& newNameSub);
public:
static void MangleTypeInst(MangleContext& mangleContext, StringImpl& name, BfTypeInstance* typeInst, BfTypeInstance* postfixTypeInst = NULL, bool* isEndOpen = NULL);
static void Mangle(MangleContext& mangleContext, StringImpl& name, BfType* type, BfType* postfixType = NULL, bool isConst = false);
static String Mangle(BfType* type, BfModule* module = NULL);
static String Mangle(BfMethodInstance* methodRef);
static String Mangle(BfMethodInstance* methodRef);
static String MangleMethodName(BfTypeInstance* type, const StringImpl& methodName);
static String Mangle(BfFieldInstance* methodRef);
static String MangleStaticFieldName(BfTypeInstance* type, const StringImpl& fieldName);
@ -138,12 +138,12 @@ public:
class MangleContext
{
public:
bool mIsSafeMangle;
bool mIsSafeMangle;
BfModule* mModule;
bool mCCompat;
bool mCPPMangle;
bool mIs64Bit;
bool mIs64Bit;
SizedArray<NameSubstitute, 10> mSubstituteList;
SizedArray<BfType*, 10> mSubstituteTypeList;
@ -154,7 +154,7 @@ public:
public:
MangleContext()
{
mIsSafeMangle = false;
mIsSafeMangle = false;
mModule = NULL;
mCCompat = false;
mIs64Bit = false;
@ -164,11 +164,11 @@ public:
mInRet = false;
}
BfModule* GetUnreifiedModule();
BfModule* GetUnreifiedModule();
};
static void AddGenericArgs(MangleContext& mangleContext, StringImpl& name, const SizedArrayImpl<BfType*>& genericArgs, int numOuterGenericParams = 0);
static void AddStr(MangleContext& mangleContext, StringImpl& name, const StringImpl& str);
static void Mangle(MangleContext& mangleContext, StringImpl& name, BfType* type, bool useTypeList = false, bool isConst = false);
static void Mangle(MangleContext& mangleContext, StringImpl& name, BfTypeInstance* typeInst, bool isAlreadyStarted, bool isOuterType = false);
@ -176,8 +176,8 @@ public:
void AddPrefix(MangleContext & mangleContext, StringImpl& name, int startIdx, const char * prefix);
static void AddSubIdx(StringImpl& name, int strIdx);
static void AddTypeStart(MangleContext & mangleContext, StringImpl& name, BfType* type);
static void AddSubIdx(StringImpl& name, int strIdx);
static void AddTypeStart(MangleContext & mangleContext, StringImpl& name, BfType* type);
static bool FindOrCreateNameSub(MangleContext& mangleContext, StringImpl& name, const NameSubstitute& newNameSub);
public:
@ -188,7 +188,7 @@ public:
static void MangleStaticFieldName(StringImpl& outStr, bool is64Bit, BfTypeInstance* type, const StringImpl& fieldName, BfType* fieldType = NULL);
};
// A "safe mangle" is used for reconnecting deleted types to their previous id. We make sure we never force a
// A "safe mangle" is used for reconnecting deleted types to their previous id. We make sure we never force a
// PopulateType with this kind of mangle, as referenced types may be deleted and marked as undefined
class BfSafeMangler : public BfMSMangler
{

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -6,14 +6,13 @@ USING_NS_BF;
//////////////////////////////////////////////////////////////////////////
void BfNamespaceVisitor::Visit(BfUsingDirective* usingDirective)
{
if (usingDirective->mNamespace == NULL)
{
{
return;
}
String usingString = usingDirective->mNamespace->ToString();
BfAtomCompositeT<16> usingComposite;
mSystem->ParseAtomComposite(usingString, usingComposite);
@ -24,11 +23,11 @@ void BfNamespaceVisitor::Visit(BfUsingDirective* usingDirective)
}
void BfNamespaceVisitor::Visit(BfUsingModDirective* usingDirective)
{
{
BfAstNode* useNode = usingDirective->mTypeRef;
BfAstNode* checkNode = usingDirective->mTypeRef;
while (true)
{
{
if (auto qualifiedTypeRef = BfNodeDynCast<BfQualifiedTypeReference>(checkNode))
checkNode = qualifiedTypeRef->mLeft;
else if (auto elementedTypeRef = BfNodeDynCast<BfElementedTypeRef>(checkNode))
@ -42,9 +41,9 @@ void BfNamespaceVisitor::Visit(BfUsingModDirective* usingDirective)
if (useNode == NULL)
return;
String usingString = useNode->ToString();
BfAtomCompositeT<16> usingComposite;
if (mSystem->ParseAtomComposite(usingString, usingComposite))
mResolvePassData->HandleNamespaceReference(useNode, usingComposite);
@ -53,7 +52,7 @@ void BfNamespaceVisitor::Visit(BfUsingModDirective* usingDirective)
void BfNamespaceVisitor::Visit(BfNamespaceDeclaration* namespaceDeclaration)
{
BfAtomCompositeT<16> prevNamespace = mNamespace;
if (namespaceDeclaration->mNameNode == NULL)
return;
@ -64,7 +63,7 @@ void BfNamespaceVisitor::Visit(BfNamespaceDeclaration* namespaceDeclaration)
if (dotIdx == -1)
{
BfAtom* namespaceAtom = mSystem->FindAtom(namespaceLeft);
mNamespace.Set(mNamespace.mParts, mNamespace.mSize, &namespaceAtom, 1);
mNamespace.Set(mNamespace.mParts, mNamespace.mSize, &namespaceAtom, 1);
break;
}
@ -76,7 +75,7 @@ void BfNamespaceVisitor::Visit(BfNamespaceDeclaration* namespaceDeclaration)
if (mResolvePassData->mAutoComplete != NULL)
mResolvePassData->mAutoComplete->CheckNamespace(namespaceDeclaration->mNameNode, mNamespace);
mResolvePassData->HandleNamespaceReference(namespaceDeclaration->mNameNode, mNamespace);
VisitChild(namespaceDeclaration->mBody);
VisitChild(namespaceDeclaration->mBody);
mNamespace = prevNamespace;
}
@ -88,4 +87,4 @@ void BfNamespaceVisitor::Visit(BfBlock* block)
void BfNamespaceVisitor::Visit(BfRootNode* rootNode)
{
VisitMembers(rootNode);
}
}

View file

@ -9,7 +9,7 @@ class BfResolvePassData;
class BfNamespaceVisitor : public BfStructuralVisitor
{
public:
public:
BfSystem* mSystem;
BfResolvePassData* mResolvePassData;
BfAtomComposite mNamespace;
@ -20,7 +20,7 @@ public:
mSystem = NULL;
mResolvePassData = NULL;
}
virtual void Visit(BfUsingDirective* usingDirective) override;
virtual void Visit(BfUsingModDirective* usingDirective) override;
virtual void Visit(BfNamespaceDeclaration* namespaceDeclaration) override;

View file

@ -1,6 +1,5 @@
#pragma warning(disable:4996)
#include "BfParser.h"
#include "BfReducer.h"
#include "BfPrinter.h"
@ -158,7 +157,7 @@ void BfParserCache::ReportMemory(MemReporter* memReporter)
int allocPages = 0;
int usedPages = 0;
mAstAllocManager.GetStats(allocPages, usedPages);
OutputDebugStrF("Parsers: %d Chars: %d UsedAlloc: %dk BytesPerChar: %d SysAllocPages: %d SysUsedPages: %d (%dk) LargeAllocs: %dk\n", (int)mEntries.size(), srcLen, allocBytesUsed / 1024,
allocBytesUsed / BF_MAX(1, srcLen), allocPages, usedPages, (usedPages * BfAstAllocManager::PAGE_SIZE) / 1024, largeAllocs / 1024);
@ -182,7 +181,6 @@ static int DecodeInt(uint8* buf, int& idx)
curByte = buf[idx++];
value |= ((curByte & 0x7f) << shift);
shift += 7;
} while (curByte >= 128);
// Sign extend negative numbers.
if (((curByte & 0x40) != 0) && (shift < 64))
@ -192,14 +190,14 @@ static int DecodeInt(uint8* buf, int& idx)
static int gCurDataId = 0;
BfParserData::BfParserData()
{
{
mDataId = (int)BfpSystem_InterlockedExchangeAdd32((uint32*)&gCurDataId, 1) + 1;
mHash = 0;
mRefCount = -1;
mJumpTable = NULL;
mJumpTableSize = 0;
mFailed = false;
mFailed = false;
mCharIdData = NULL;
mUniqueParser = NULL;
mDidReduce = false;
@ -239,7 +237,7 @@ int BfParserData::GetCharIdAtIndex(int findIndex)
}
void BfParserData::GetLineCharAtIdx(int idx, int& line, int& lineChar)
{
{
if (mJumpTableSize <= 0)
{
line = 0;
@ -348,7 +346,7 @@ BfParser::BfParser(BfSystem* bfSystem, BfProject* bfProject) : BfSource(bfSystem
{
BfLogSys(bfSystem, "BfParser::BfParser %08X\n", this);
gParserCount++;
gParserCount++;
mTextVersion = -1;
mEmbedKind = BfSourceEmbedKind_None;
@ -374,15 +372,15 @@ BfParser::BfParser(BfSystem* bfSystem, BfProject* bfProject) : BfSource(bfSystem
mLineStart = 0;
//mCurToken = (BfSyntaxToken)0;
mToken = BfToken_None;
mSyntaxToken = BfSyntaxToken_None;
mSyntaxToken = BfSyntaxToken_None;
mTokenStart = 0;
mTokenEnd = 0;
mLineNum = 0;
mLineNum = 0;
mCompatMode = false;
mQuickCompatMode = false;
mLiteral.mWarnType = 0;
mDataId = -1;
mDataId = -1;
mTriviaStart = 0;
mParsingFailed = false;
@ -397,7 +395,6 @@ BfParser::BfParser(BfSystem* bfSystem, BfProject* bfProject) : BfSource(bfSystem
}
}
//static std::set<BfAstNode*> gFoundNodes;
BfParser::~BfParser()
@ -406,7 +403,6 @@ BfParser::~BfParser()
if (mParserData == NULL)
{
}
else if (mParserData->mRefCount == -1)
{
@ -419,12 +415,12 @@ BfParser::~BfParser()
// Just never got added to the cache
delete mParserData;
}
else
else
{
mParserData->Deref();
mParserData->Deref();
}
mSourceData = NULL;
mSourceData = NULL;
BfLogSys(mSystem, "BfParser::~BfParser %p\n", this);
}
@ -470,9 +466,9 @@ void BfParser::TokenFail(const StringImpl& error, int offset)
void BfParser::Init(uint64 cacheHash)
{
BF_ASSERT(mParserData == NULL);
mParserData = new BfParserData();
mSourceData = mParserData;
mSourceData = mParserData;
mParserData->mFileName = mFileName;
if (mDataId != -1)
mParserData->mDataId = mDataId;
@ -481,7 +477,7 @@ void BfParser::Init(uint64 cacheHash)
mParserData->mAstAllocManager = &gBfParserCache->mAstAllocManager;
mParserData->mSrc = mSrc;
mParserData->mSrcLength = mSrcLength;
if (cacheHash != 0)
{
BfLogSysM("Creating cached parserData %p for %p %s\n", mParserData, this, mFileName.c_str());
@ -503,9 +499,9 @@ void BfParser::Init(uint64 cacheHash)
mParserData->mJumpTable = mJumpTable;
mParserData->mJumpTableSize = mJumpTableSize;
mAlloc = &mParserData->mAlloc;
mAlloc->mSourceData = mSourceData;
mAlloc->mSourceData = mSourceData;
}
void BfParser::NewLine()
@ -529,7 +525,7 @@ void BfParser::SetSource(const char* data, int length)
const int EXTRA_BUFFER_SIZE = 80; // Extra chars for a bit of AllocChars room
//TODO: Check cache
// Don't cache if we have a Cursorid set,
// Don't cache if we have a Cursorid set,
// if mDataId != -1
// if BfParerFlag != 0
@ -570,7 +566,7 @@ void BfParser::SetSource(const char* data, int length)
BfParserCache::DataEntry* dataEntryP;
if (gBfParserCache->mEntries.TryGetWith(lookupEntry, &dataEntryP))
{
{
mUsingCache = true;
mParserData = dataEntryP->mParserData;
@ -595,7 +591,7 @@ void BfParser::SetSource(const char* data, int length)
mSrcLength = length;
mOrigSrcLength = length;
mSrcAllocSize = mSrcLength /*+ EXTRA_BUFFER_SIZE*/;
mSrcAllocSize = mSrcLength /*+ EXTRA_BUFFER_SIZE*/;
char* ownedSrc = new char[mSrcAllocSize + 1];
if (data != NULL)
memcpy(ownedSrc, data, length);
@ -753,7 +749,7 @@ BfBlock* BfParser::ParseInlineBlock(int spaceIdx, int endIdx)
break;
if ((childNode->IsA<BfCommentNode>()))
{
mSidechannelRootNode->Add(childNode);
mSidechannelRootNode->Add(childNode);
mPendingSideNodes.push_back(childNode);
continue;
}
@ -798,7 +794,7 @@ void BfParser::HandlePragma(const StringImpl& pragma, BfBlock* block)
if (paramNode->ToStringView() == "warning")
{
++itr;
//auto iterNode = paramNode->mNext;
//auto iterNode = paramNode->mNext;
//BfAstNode* iterNode = parentNode->mChildArr.GetAs<BfAstNode*>(++curIdx);
BfAstNode* iterNode = itr.Get();
@ -863,11 +859,11 @@ void BfParser::HandlePragma(const StringImpl& pragma, BfBlock* block)
}
else if (paramNode->ToStringView() == "format")
{
++itr;
++itr;
BfAstNode* iterNode = itr.Get();
if (iterNode)
{
if ((iterNode->ToStringView() != "disable") &&
if ((iterNode->ToStringView() != "disable") &&
(iterNode->ToStringView() != "restore"))
{
mPassInstance->FailAfterAt("Expected \"disable\" or \"restore\" after \"format\"", mSourceData, paramNode->GetSrcEnd() - 1);
@ -881,13 +877,13 @@ void BfParser::HandlePragma(const StringImpl& pragma, BfBlock* block)
}
void BfParser::HandleDefine(const StringImpl& name, BfAstNode* paramNode)
{
{
mPreprocessorDefines[name] = BfDefineState_ManualSet;
}
void BfParser::HandleUndefine(const StringImpl& name)
{
mPreprocessorDefines[name] = BfDefineState_ManualUnset;
mPreprocessorDefines[name] = BfDefineState_ManualUnset;
}
MaybeBool BfParser::HandleIfDef(const StringImpl& name)
@ -925,16 +921,14 @@ MaybeBool BfParser::HandleProcessorCondition(BfBlock* paramNode)
void BfParser::HandleInclude(BfAstNode* paramNode)
{
}
void BfParser::HandleIncludeNext(BfAstNode* paramNode)
{
}
bool BfParser::HandlePreprocessor()
{
{
int triviaStart = mTriviaStart;
int checkIdx = 0;
@ -958,7 +952,7 @@ bool BfParser::HandlePreprocessor()
String pragmaParam;
switch (mSrc[mSrcIdx - 1])
{
{
case '<':
if (mPreprocessorIgnoreDepth > 0)
return false;
@ -967,15 +961,15 @@ bool BfParser::HandlePreprocessor()
case '=':
if (mPreprocessorIgnoreDepth > 0)
return false;
pragma = "===";
break;
pragma = "===";
break;
case '>':
if (mPreprocessorIgnoreDepth > 1)
return false;
return false;
pragma = ">>>";
break;
}
bool atEnd = false;
int startIdx = mSrcIdx - 1;
@ -1003,7 +997,7 @@ bool BfParser::HandlePreprocessor()
}
if (!hadSlash)
break;
break;
}
if (c == '\0')
@ -1045,7 +1039,7 @@ bool BfParser::HandlePreprocessor()
BfBlock* paramNode = NULL;
if (pragma.IsEmpty())
{
{
if (spaceIdx != -1)
{
pragma = String(mSrc + charIdx, mSrc + spaceIdx);
@ -1234,7 +1228,7 @@ bool BfParser::HandlePreprocessor()
mPreprocessorNodeStack.pop_back();
}
else if (pragma == "define")
{
{
if ((paramNode != NULL) && (!paramNode->mChildArr.IsEmpty()))
HandleDefine(paramNode->mChildArr[0]->ToString(), paramNode);
wantedParam = true;
@ -1247,7 +1241,7 @@ bool BfParser::HandlePreprocessor()
}
else if (pragma == "error")
{
wantsSingleParam = false;
wantsSingleParam = false;
mPassInstance->FailAt(pragmaParam, mSourceData, startIdx, mSrcIdx - startIdx);
wantedParam = true;
}
@ -1370,7 +1364,6 @@ struct StrHashT<4>
{
const static int HASH = (StrHashT<3>::HASH) ^ Str[4];
};
};
// This is little endian only
@ -1512,7 +1505,7 @@ void BfParser::NextToken(int endIdx, bool outerIsInterpolate, bool disablePrepro
if (mSrc[mSrcIdx + 1] == '=')
{
if (mSrc[mSrcIdx + 2] == '=')
{
{
if (HandlePreprocessor())
{
// Conflict split
@ -1782,7 +1775,7 @@ void BfParser::NextToken(int endIdx, bool outerIsInterpolate, bool disablePrepro
}
break;
case '$':
c = mSrc[mSrcIdx];
if ((c == '\"') || (c == '@') || (c == '$'))
{
@ -1795,7 +1788,7 @@ void BfParser::NextToken(int endIdx, bool outerIsInterpolate, bool disablePrepro
case '\'':
{
SizedArray<BfUnscopedBlock*, 4> interpolateExpressions;
String lineHeader;
String strLiteral;
char startChar = c;
@ -2139,9 +2132,9 @@ void BfParser::NextToken(int endIdx, bool outerIsInterpolate, bool disablePrepro
mPassInstance->FailAfterAt("Expected '}'", mSourceData, newBlock->GetSrcEnd() - 1);
}
mInAsmBlock = false;
interpolateExpressions.Add(newBlock);
interpolateExpressions.Add(newBlock);
}
if (interpolateSetting == 1)
{
for (int i = 0; i < braceCount - 1; i++)
@ -2169,7 +2162,7 @@ void BfParser::NextToken(int endIdx, bool outerIsInterpolate, bool disablePrepro
braceCount++;
mSrcIdx++;
}
bool isClosingBrace = false;
if (!interpolateExpressions.IsEmpty())
@ -2186,14 +2179,14 @@ void BfParser::NextToken(int endIdx, bool outerIsInterpolate, bool disablePrepro
isClosingBrace = true;
}
else if (block->mCloseBrace->mSrcStart == mSrcIdx - braceCount)
{
{
block->mCloseBrace->mSrcEnd = mSrcIdx - braceCount + interpolateSetting;
isClosingBrace = true;
}
}
if (interpolateSetting == 1)
{
{
for (int i = 0; i < braceCount - 1; i++)
strLiteral += '}';
}
@ -2222,7 +2215,7 @@ void BfParser::NextToken(int endIdx, bool outerIsInterpolate, bool disablePrepro
{
mTokenStart = stringStart;
stringStart = -1;
}
}
mTriviaStart = triviaStart;
mTokenEnd = mSrcIdx;
@ -2246,7 +2239,7 @@ void BfParser::NextToken(int endIdx, bool outerIsInterpolate, bool disablePrepro
{
bool isGraphemeCluster = false;
// There's no explicit unicode limit to how many diacriticals a grapheme cluster can contain,
// There's no explicit unicode limit to how many diacriticals a grapheme cluster can contain,
// but we apply a limit for sanity for the purpose of this error
if (strLiteral.length() < 64)
{
@ -2266,7 +2259,7 @@ void BfParser::NextToken(int endIdx, bool outerIsInterpolate, bool disablePrepro
{
mLiteral.mInt64 = (uint8)strLiteral[0];
}
if (mLiteral.mInt64 >= 0x8000) // Use 0x8000 to remain UTF16-compatible
mLiteral.mTypeCode = BfTypeCode_Char32;
else if (mLiteral.mInt64 >= 0x80) // Use 0x80 to remain UTF8-compatible
@ -2289,7 +2282,7 @@ void BfParser::NextToken(int endIdx, bool outerIsInterpolate, bool disablePrepro
interpolateExpr->mTriviaStart = mTriviaStart;
interpolateExpr->mSrcStart = mTokenStart;
interpolateExpr->mSrcEnd = mSrcIdx;
BfSizedArrayInitIndirect(interpolateExpr->mExpressions, interpolateExpressions, mAlloc);
BfSizedArrayInitIndirect(interpolateExpr->mExpressions, interpolateExpressions, mAlloc);
mGeneratedNode = interpolateExpr;
mSyntaxToken = BfSyntaxToken_GeneratedNode;
mToken = BfToken_None;
@ -2321,10 +2314,10 @@ void BfParser::NextToken(int endIdx, bool outerIsInterpolate, bool disablePrepro
if (!mPendingSideNodes.IsEmpty())
{
if (auto prevComment = BfNodeDynCast<BfCommentNode>(mPendingSideNodes.back()))
{
{
// This is required for folding '///' style multi-line documentation into a single node
if (prevComment->GetTriviaStart() == mTriviaStart)
{
{
auto prevCommentKind = GetCommentKind(prevComment->mSrcStart);
if ((!BfIsCommentBlock(commentKind)) && (commentKind == prevCommentKind))
@ -2339,7 +2332,7 @@ void BfParser::NextToken(int endIdx, bool outerIsInterpolate, bool disablePrepro
if ((!handled) && (!disablePreprocessor))
{
auto bfCommentNode = mAlloc->Alloc<BfCommentNode>();
bfCommentNode->Init(this);
bfCommentNode->Init(this);
bfCommentNode->mCommentKind = commentKind;
mSidechannelRootNode->Add(bfCommentNode);
mPendingSideNodes.push_back(bfCommentNode);
@ -2547,7 +2540,7 @@ void BfParser::NextToken(int endIdx, bool outerIsInterpolate, bool disablePrepro
return;
default:
if (((c >= '0') && (c <= '9')) || (c == '-'))
{
{
bool prevIsDot = prevToken == BfToken_Dot;
if (c == '-')
@ -2577,7 +2570,7 @@ void BfParser::NextToken(int endIdx, bool outerIsInterpolate, bool disablePrepro
mTokenEnd = mSrcIdx;
return;
}
bool hadOverflow = false;
uint64 val = 0;
int numberBase = 10;
@ -2674,14 +2667,14 @@ void BfParser::NextToken(int endIdx, bool outerIsInterpolate, bool disablePrepro
{
// Skip float parsing if we have a double-dot `1..` case
hasDot = false;
}
}
// The 'prevIsDot' helps tuple lookups like "tuple.0.0", interpreting those as two integers rather than a float
if (((hasDot) && (!prevIsDot)) || (hasExp))
{
// Switch to floating point mode
//double dVal = val;
//double dValScale = 0.1;
//double dValScale = 0.1;
//if (hasExp)
//dVal *= pow(10, expVal);
while (true)
@ -2796,7 +2789,7 @@ void BfParser::NextToken(int endIdx, bool outerIsInterpolate, bool disablePrepro
if (endNumber)
{
mTokenEnd = mSrcIdx - 1;
mSrcIdx--;
mSrcIdx--;
if ((numberBase == 0x10) &&
((hexDigits >= 16) || ((hadSeps) && (hexDigits > 8)) || ((hadLeadingHexSep) && (hexDigits == 8))))
@ -2815,7 +2808,7 @@ void BfParser::NextToken(int endIdx, bool outerIsInterpolate, bool disablePrepro
mLiteral.mTypeCode = BfTypeCode_IntUnknown;
if ((numberBase == 0x10) && (hexDigits == 7))
mLiteral.mWarnType = BfWarning_BF4201_Only7Hex;
mLiteral.mWarnType = BfWarning_BF4201_Only7Hex;
if ((numberBase == 0x10) && (hexDigits == 9))
mLiteral.mWarnType = BfWarning_BF4202_TooManyHexForInt;
@ -2830,9 +2823,9 @@ void BfParser::NextToken(int endIdx, bool outerIsInterpolate, bool disablePrepro
mLiteral.mTypeCode = BfTypeCode_UInt64;
}
else if (val > 0xFFFFFFFFLL)
{
{
mLiteral.mTypeCode = BfTypeCode_Int64;
}
}
}
mSyntaxToken = BfSyntaxToken_Literal;
@ -2859,9 +2852,9 @@ void BfParser::NextToken(int endIdx, bool outerIsInterpolate, bool disablePrepro
val *= numberBase;
val += c - 'a' + 0xa;
}
else if ((c == 'u') || (c == 'U'))
{
{
if ((mSrc[mSrcIdx] == 'l') || (mSrc[mSrcIdx] == 'L'))
{
if (mSrc[mSrcIdx] == 'l')
@ -2888,7 +2881,7 @@ void BfParser::NextToken(int endIdx, bool outerIsInterpolate, bool disablePrepro
else if ((c == 'l') || (c == 'L'))
{
if (c == 'l')
TokenFail("Uppercase 'L' required for int64");
TokenFail("Uppercase 'L' required for int64");
if ((mSrc[mSrcIdx] == 'u') || (mSrc[mSrcIdx] == 'U'))
{
mSrcIdx++;
@ -2901,12 +2894,12 @@ void BfParser::NextToken(int endIdx, bool outerIsInterpolate, bool disablePrepro
mPassInstance->FailAt("Value doesn't fit into uint64", mSourceData, mTokenStart, mSrcIdx - mTokenStart);
mSyntaxToken = BfSyntaxToken_Literal;
return;
}
}
mTokenEnd = mSrcIdx;
mLiteral.mTypeCode = BfTypeCode_Int64;
mLiteral.mInt64 = (int64)val;
if (val == 0x8000000000000000)
mLiteral.mTypeCode = BfTypeCode_UInt64;
mLiteral.mTypeCode = BfTypeCode_UInt64;
else if (val >= 0x8000000000000000)
hadOverflow = true;
if (numberBase == 0x10)
@ -2938,14 +2931,14 @@ void BfParser::NextToken(int endIdx, bool outerIsInterpolate, bool disablePrepro
else
{
mTokenEnd = mSrcIdx - 1;
mSrcIdx--;
mSrcIdx--;
mLiteral.mUInt64 = val;
mLiteral.mTypeCode = BfTypeCode_IntUnknown;
mSyntaxToken = BfSyntaxToken_Literal;
TokenFail("Unexpected character while parsing number", 0);
return;
}
if ((uint64)prevVal > (uint64)val)
hadOverflow = true;
}
@ -3188,7 +3181,7 @@ void BfParser::NextToken(int endIdx, bool outerIsInterpolate, bool disablePrepro
if (SrcPtrHasToken("new"))
mToken = BfToken_New;
break;
case TOKEN_HASH('n', 'u', 'l', 'l'):
case TOKEN_HASH('n', 'u', 'l', 'l'):
if (SrcPtrHasToken("null"))
mToken = BfToken_Null;
else if (SrcPtrHasToken("nullable"))
@ -3213,7 +3206,7 @@ void BfParser::NextToken(int endIdx, bool outerIsInterpolate, bool disablePrepro
case TOKEN_HASH('p', 'a', 'r', 'a'):
if ((!mCompatMode) && (SrcPtrHasToken("params")))
mToken = BfToken_Params;
break;
break;
case TOKEN_HASH('p', 'r', 'i', 'v'):
if (SrcPtrHasToken("private"))
mToken = BfToken_Private;
@ -3460,7 +3453,7 @@ void BfParser::NextToken(int endIdx, bool outerIsInterpolate, bool disablePrepro
{
if (interpolateSetting == 0)
stringStart = mTokenStart;
interpolateSetting++;
interpolateSetting++;
}
}
}
@ -3476,7 +3469,7 @@ void BfParser::ParseBlock(BfBlock* astNode, int depth, bool isInterpolate)
bool isAsmBlock = false;
bool isTernary = false;
SizedArray<BfAstNode*, 32> childArr;
SizedArray<BfAstNode*, 32> childArr;
int parenDepth = 0;
@ -3491,7 +3484,7 @@ void BfParser::ParseBlock(BfBlock* astNode, int depth, bool isInterpolate)
}
NextToken(-1, isInterpolate && (parenDepth == 0));
if (mPreprocessorIgnoredSectionNode != NULL)
{
if (mSyntaxToken != BfSyntaxToken_EOF)
@ -3508,7 +3501,7 @@ void BfParser::ParseBlock(BfBlock* astNode, int depth, bool isInterpolate)
gParseMemberIdx++;
int memberIdx = gParseMemberIdx;
auto childNode = CreateNode();
if (childNode == NULL)
break;
@ -3556,12 +3549,12 @@ void BfParser::ParseBlock(BfBlock* astNode, int depth, bool isInterpolate)
}
mInAsmBlock = false;
astNode->Add(newBlock);
childArr.push_back(newBlock);
}
childArr.push_back(newBlock);
}
else if (mToken == BfToken_RBrace)
{
if (depth == 0)
Fail("Unexpected ending brace");
Fail("Unexpected ending brace");
break;
}
else
@ -3578,7 +3571,7 @@ void BfParser::ParseBlock(BfBlock* astNode, int depth, bool isInterpolate)
bool endNow = false;
if (mToken == BfToken_Colon)
{
{
endNow = true;
if (!childArr.IsEmpty())
{
@ -3599,7 +3592,7 @@ void BfParser::ParseBlock(BfBlock* astNode, int depth, bool isInterpolate)
if (mToken == BfToken_Comma)
endNow = true;
if (endNow)
{
mSrcIdx = mTokenStart;
@ -3607,7 +3600,7 @@ void BfParser::ParseBlock(BfBlock* astNode, int depth, bool isInterpolate)
}
}
astNode->Add(childNode);
astNode->Add(childNode);
childArr.Add(childNode);
if ((mSyntaxToken == BfSyntaxToken_Token) && (mToken == BfToken_RBrace))
@ -3667,7 +3660,7 @@ void BfParser::Parse(BfPassInstance* passInstance)
mSyntaxToken = BfSyntaxToken_None;
mPassInstance = passInstance;
int startIdx = mSrcIdx;
int startIdx = mSrcIdx;
if (mUsingCache)
{
@ -3708,7 +3701,7 @@ void BfParser::Parse(BfPassInstance* passInstance)
if ((mPassInstance->HasMessages()) || (mParsingFailed))
{
mParserData->mFailed = true; // Don't reuse cache if there were errors or warnings
mParserData->mFailed = true; // Don't reuse cache if there were errors or warnings
}
mPassInstance = NULL;
@ -3739,18 +3732,18 @@ void BfParser::Close()
}
else
{
// It's possible two of the same entries were being parsed at the same time on different threads.
// It's possible two of the same entries were being parsed at the same time on different threads.
// Just let the loser be deleted in the dtor
BfLogSys(mSystem, "Duplicate parser %p not added to cache\n", this);
}
}
}
}
void BfParser::HadSrcRealloc()
{
int jumpTableSize = ((mSrcAllocSize + 1) + PARSER_JUMPTABLE_DIVIDE - 1) / PARSER_JUMPTABLE_DIVIDE;
if (jumpTableSize > mJumpTableSize)
{
{
auto jumpTable = new BfLineStartEntry[jumpTableSize];
memset(jumpTable, 0, jumpTableSize * sizeof(BfLineStartEntry));
memcpy(jumpTable, mJumpTable, mJumpTableSize * sizeof(BfLineStartEntry));
@ -3763,7 +3756,6 @@ void BfParser::HadSrcRealloc()
mParserData->mJumpTable = mJumpTable;
mParserData->mJumpTableSize = mJumpTableSize;
}
}
void BfParser::GenerateAutoCompleteFrom(int srcPosition)
@ -3782,7 +3774,7 @@ void BfParser::ReportMemory(MemReporter* memReporter)
// if (!mUsingCache)
// memReporter->AddBumpAlloc("AstAlloc", *mAlloc);
//
//
// memReporter->Add("JumpTable", mJumpTableSize * sizeof(BfLineStartEntry));
memReporter->Add(sizeof(BfParser));
@ -3917,7 +3909,7 @@ BF_EXPORT void BF_CALLTYPE BfParser_SetNextRevision(BfParser* bfParser, BfParser
BF_EXPORT void BF_CALLTYPE BfParser_SetCursorIdx(BfParser* bfParser, int cursorIdx)
{
bfParser->SetCursorIdx(cursorIdx);
bfParser->SetCursorIdx(cursorIdx);
}
BF_EXPORT void BF_CALLTYPE BfParser_SetIsClassifying(BfParser* bfParser)
@ -3961,7 +3953,7 @@ BF_EXPORT bool BF_CALLTYPE BfParser_Reduce(BfParser* bfParser, BfPassInstance* b
BP_ZONE("BfParser_Reduce");
if (bfParser->mUsingCache)
return true; // Already reduced
bfParser->FinishSideNodes();
int startFailIdx = bfPassInstance->mFailedIdx;
int startWarningCount = bfPassInstance->mWarningCount;
@ -4013,7 +4005,7 @@ BF_EXPORT const char* BF_CALLTYPE BfParser_DocPrep(BfParser* bfParser)
bfPrinter.mCharMapping = &gCharMapping;
bfPrinter.mDocPrep = true;
bfPrinter.Visit(bfParser->mRootNode);
outString = bfPrinter.mOutString;
outString = bfPrinter.mOutString;
return outString.c_str();
}
@ -4094,7 +4086,7 @@ BF_EXPORT BfResolvePassData* BF_CALLTYPE BfParser_CreateResolvePassData(BfParser
}
BF_EXPORT bool BF_CALLTYPE BfParser_BuildDefs(BfParser* bfParser, BfPassInstance* bfPassInstance, BfResolvePassData* resolvePassData, bool fullRefresh)
{
{
if (bfParser->mCursorIdx != -1)
resolvePassData->mHasCursorIdx = true;
@ -4108,7 +4100,6 @@ BF_EXPORT bool BF_CALLTYPE BfParser_BuildDefs(BfParser* bfParser, BfPassInstance
BF_EXPORT void BF_CALLTYPE BfParser_RemoveDefs(BfParser* bfParser)
{
}
BF_EXPORT void BF_CALLTYPE BfParser_ClassifySource(BfParser* bfParser, BfSourceClassifier::CharData* charData, bool preserveFlags)
@ -4117,18 +4108,18 @@ BF_EXPORT void BF_CALLTYPE BfParser_ClassifySource(BfParser* bfParser, BfSourceC
bfParser->Close();
BfSourceClassifier bfSourceClassifier(bfParser, charData);
bfSourceClassifier.mPreserveFlags = preserveFlags;
bfSourceClassifier.mPreserveFlags = preserveFlags;
bfSourceClassifier.Visit(bfParser->mRootNode);
bfSourceClassifier.mIsSideChannel = false; //? false or true?
bfSourceClassifier.Visit(bfParser->mErrorRootNode);
bfSourceClassifier.mIsSideChannel = true;
bfSourceClassifier.Visit(bfParser->mSidechannelRootNode);
bfSourceClassifier.Visit(bfParser->mSidechannelRootNode);
}
BF_EXPORT void BF_CALLTYPE BfParser_CreateClassifier(BfParser* bfParser, BfPassInstance* bfPassInstance, BfResolvePassData* resolvePassData, BfSourceClassifier::CharData* charData)
{
resolvePassData->mIsClassifying = true;
bfParser->mSourceClassifier = new BfSourceClassifier(bfParser, charData);
bfParser->mSourceClassifier = new BfSourceClassifier(bfParser, charData);
bfParser->mSourceClassifier->mClassifierPassId = bfPassInstance->mClassifierPassId;
if ((resolvePassData->mParsers.IsEmpty()) || (bfParser != resolvePassData->mParsers[0]))
@ -4140,7 +4131,7 @@ BF_EXPORT void BF_CALLTYPE BfParser_CreateClassifier(BfParser* bfParser, BfPassI
bfParser->mSourceClassifier->mSkipMethodInternals = true;
bfParser->mSourceClassifier->mSkipTypeDeclarations = true;
if (charData != NULL)
{
{
if ((doClassifyPass) && (bfParser->mRootNode != NULL))
bfParser->mSourceClassifier->Visit(bfParser->mRootNode);
}
@ -4179,4 +4170,4 @@ BF_EXPORT void BF_CALLTYPE BfParser_GenerateAutoCompletionFrom(BfParser* bfParse
BF_EXPORT void BF_CALLTYPE BfParser_SetCompleteParse(BfParser* bfParser)
{
bfParser->mCompleteParse = true;
}
}

View file

@ -20,15 +20,15 @@ enum BfSyntaxToken
{
BfSyntaxToken_None,
BfSyntaxToken_Token,
BfSyntaxToken_Identifier,
BfSyntaxToken_Identifier,
BfSyntaxToken_CharQuote,
BfSyntaxToken_StringQuote,
BfSyntaxToken_StringQuote,
BfSyntaxToken_ForwardSlash,
BfSyntaxToken_Literal,
BfSyntaxToken_Literal,
BfSyntaxToken_CommentLine,
BfSyntaxToken_CommentBlock,
BfSyntaxToken_GeneratedNode,
BfSyntaxToken_FAILED,
BfSyntaxToken_GeneratedNode,
BfSyntaxToken_FAILED,
BfSyntaxToken_HIT_END_IDX,
BfSyntaxToken_EOF
};
@ -59,12 +59,12 @@ enum MaybeBool
{
MaybeBool_None = -1,
MaybeBool_False = 0,
MaybeBool_True = 1,
MaybeBool_True = 1,
};
class BfParserData : public BfSourceData
{
public:
public:
uint64 mHash;
int mDataId;
int mRefCount; // -1 = not cached
@ -82,7 +82,7 @@ public:
Dictionary<int, BfParserWarningEnabledChange> mWarningEnabledChanges;
std::set<int> mUnwarns;
bool mFailed; // Don't cache if there's a warning or an error
bool mDidReduce;
bool mDidReduce;
public:
BfParserData();
@ -95,11 +95,11 @@ public:
}
virtual BfParser* ToParser() override;
int GetCharIdAtIndex(int findIndex);
int GetCharIdAtIndex(int findIndex);
void GetLineCharAtIdx(int idx, int& line, int& lineChar);
bool IsUnwarnedAt(BfAstNode* node);
bool IsWarningEnabledAtSrcIndex(int warningNumber, int srcIdx);
void ReportMemory(MemReporter* memReporter);
void ReportMemory(MemReporter* memReporter);
};
class BfParserCache
@ -115,7 +115,7 @@ public:
};
struct DataEntry
{
{
BfParserData* mParserData;
bool operator==(const LookupEntry& lookup) const;
@ -123,7 +123,7 @@ public:
{
return lookup.mParserData == mParserData;
}
};
};
public:
CritSect mCritSect;
@ -131,7 +131,7 @@ public:
BfAstAllocManager mAstAllocManager;
HashSet<DataEntry> mEntries;
public:
public:
BfParserCache();
~BfParserCache();
void ReportMemory(MemReporter* memReporter);
@ -153,30 +153,30 @@ enum BfSourceEmbedKind : int8
class BfParser : public BfSource
{
public:
public:
BfParserData* mParserData;
bool mUsingCache;
BfPassInstance* mPassInstance;
BfSourceClassifier* mSourceClassifier;
String mFileName;
String mFileName;
int mTextVersion;
BfSourceEmbedKind mEmbedKind;
bool mAwaitingDelete;
bool mAwaitingDelete;
bool mCompatMode; // Does C++ compatible parsing
bool mQuickCompatMode;
bool mQuickCompatMode;
bool mScanOnly;
bool mCompleteParse;
bool mIsEmitted;
BfLineStartEntry* mJumpTable;
int mJumpTableSize;
int mOrigSrcLength;
int mOrigSrcLength;
int mDataId;
int mSrcIdx;
int mLineStart;
int mLineNum;
int mLineNum;
bool mInAsmBlock;
BfParserFlag mParserFlags;
@ -186,43 +186,43 @@ public:
BfSyntaxToken mSyntaxToken;
int mTriviaStart; // mTriviaStart < mTokenStart when there's leading whitespace
int mTokenStart;
int mTokenEnd;
int mTokenEnd;
BfAstNode* mGeneratedNode;
BfVariant mLiteral;
BfVariant mLiteral;
BfToken mToken;
BfPreprocesorIgnoredSectionNode* mPreprocessorIgnoredSectionNode;
int mPreprocessorIgnoreDepth;
Array< std::pair<BfAstNode*, bool> > mPreprocessorNodeStack;
Dictionary<String, BfDefineState> mPreprocessorDefines;
std::set<int> mPreprocessorIgnoredSectionStarts;
std::set<int> mPreprocessorIgnoredSectionStarts;
public:
virtual void HandleInclude(BfAstNode* paramNode);
virtual void HandleIncludeNext(BfAstNode* paramNode);
virtual void HandlePragma(const StringImpl& pragma, BfBlock* block);
virtual void HandleDefine(const StringImpl& name, BfAstNode* paramNode);
virtual void HandleUndefine(const StringImpl& name);
virtual void HandleUndefine(const StringImpl& name);
virtual MaybeBool HandleIfDef(const StringImpl& name);
virtual MaybeBool HandleProcessorCondition(BfBlock* paramNode);
public:
public:
void Init(uint64 cacheHash = 0);
void NewLine();
void NewLine();
BfExpression* CreateInlineExpressionFromNode(BfBlock* block);
bool EvaluatePreprocessor(BfExpression* expr);
BfBlock* ParseInlineBlock(int spaceIdx, int endIdx);
bool HandlePreprocessor();
bool HandlePreprocessor();
bool IsUnwarnedAt(BfAstNode* node);
bool SrcPtrHasToken(const char* name);
uint32 GetTokenHash();
void ParseBlock(BfBlock* astNode, int depth, bool isInterpolate = false);
double ParseLiteralDouble();
double ParseLiteralDouble();
void AddErrorNode(int startIdx, int endIdx);
BfCommentKind GetCommentKind(int startIdx);
BfCommentKind GetCommentKind(int startIdx);
public:
public:
BfParser(BfSystem* bfSystem, BfProject* bfProject = NULL);
~BfParser();
@ -232,23 +232,23 @@ public:
void GetLineCharAtIdx(int idx, int& line, int& lineChar);
void Fail(const StringImpl& error, int offset = -1);
void TokenFail(const StringImpl& error, int offset = -1);
void SetSource(const char* data, int length);
void TokenFail(const StringImpl& error, int offset = -1);
void SetSource(const char* data, int length);
void MoveSource(const char* data, int length); // Takes ownership of data ptr
void RefSource(const char* data, int length);
void MakeNegative(uint64& val, bool& hadOverflow);
void NextToken(int endIdx = -1, bool outerIsInterpolate = false, bool disablePreprocessor = false);
BfAstNode* CreateNode();
void Parse(BfPassInstance* passInstance);
BfAstNode* CreateNode();
void Parse(BfPassInstance* passInstance);
int GetCharIdAtIndex(int findIndex);
virtual void Close() override;
virtual void HadSrcRealloc() override;
void GenerateAutoCompleteFrom(int srcPosition);
void ReportMemory(MemReporter* memReporter);
void GenerateAutoCompleteFrom(int srcPosition);
void ReportMemory(MemReporter* memReporter);
void GetSrcPosition(int idx, int& lineNum, int& column);
};

File diff suppressed because it is too large Load diff

View file

@ -5,7 +5,6 @@
NS_BF_BEGIN
class BfPrinter : public BfElementVisitor
{
public:
@ -26,10 +25,10 @@ public:
struct StateModify
{
public:
bool mExpectingSpace;
bool mExpectingSpace;
int mWantNewLineIdx;
bool mDoingBlockOpen;
bool mDoingBlockClose;
bool mDoingBlockClose;
int mWantVirtualIndent;
BfAstNode* mQueuedNode;
@ -43,18 +42,18 @@ public:
void Clear()
{
mExpectingSpace = false;
mExpectingSpace = false;
mDoingBlockOpen = false;
mDoingBlockClose = false;
mQueuedNode = NULL;
}
};
BfSourceData* mSource;
BfParserData* mParser;
BfBlock::Iterator mSidechannelItr;
BfAstNode* mSidechannelNextNode;
BfAstNode* mSidechannelNextNode;
BfBlock::Iterator mErrorItr;
BfAstNode* mErrorNextNode;
@ -65,18 +64,18 @@ public:
int mCurSrcIdx;
Array<StateModify> mChildNodeQueue;
int mFormatStart;
int mFormatEnd;
int mFormatEnd;
int mFormatDisableCount;
StateModify mNextStateModify;
String mOutString;
bool mReformatting;
bool mReformatting;
bool mIgnoreTrivia;
bool mDocPrep;
BlockState* mCurBlockState;
int mCurIndentLevel;
int mQueuedSpaceCount;
int mLastSpaceOffset; // Indent difference from original to new
int mLastSpaceOffset; // Indent difference from original to new
bool mExpectingNewLine;
int mCurCol;
int mMaxCol;
@ -86,19 +85,19 @@ public:
bool mIsFirstStatementInBlock;
bool mForceUseTrivia;
bool mInSideChannel;
bool mInSideChannel;
int mStateModifyVirtualIndentLevel;
int mVirtualIndentLevel;
int mVirtualNewLineIdx;
Array<int>* mCharMapping;
int mHighestCharId;
public:
public:
BfPrinter(BfRootNode* rootNode, BfRootNode* sidechannelRootNode, BfRootNode* errorRootNode);
public:
public:
void Update(BfAstNode* bfAstNode);
bool CheckReplace(BfAstNode* astNode);
void FlushIndent();
@ -106,7 +105,7 @@ public:
void Write(BfAstNode* node, int start, int len);
void WriteSourceString(BfAstNode* node);
void QueueVisitChild(BfAstNode* astNode);
void QueueVisitErrorNodes(BfRootNode* astNode);
void QueueVisitErrorNodes(BfRootNode* astNode);
void FlushVisitChild();
void VisitChildWithPrecedingSpace(BfAstNode* bfAstNode);
void VisitChildWithProceedingSpace(BfAstNode* bfAstNode);
@ -117,9 +116,9 @@ public:
void VisitChildNextLine(BfAstNode* node);
void DoBlockOpen(BfAstNode* prevNode, BfTokenNode* blockOpen, BfTokenNode* blockClose, bool queue, BlockState& blockState);
void DoBlockClose(BfAstNode* prevNode, BfTokenNode* blockOpen, BfTokenNode* blockClose, bool queue, BlockState& blockState);
void QueueMethodDeclaration(BfMethodDeclaration* methodDeclaration);
void QueueMethodDeclaration(BfMethodDeclaration* methodDeclaration);
int CalcOrigLineSpacing(BfAstNode* bfAstNode, int* lineStartIdx);
void WriteIgnoredNode(BfAstNode* node);
void WriteIgnoredNode(BfAstNode* node);
void CheckRawNode(BfAstNode* node);
virtual void Visit(BfAstNode* bfAstNode) override;
@ -130,20 +129,20 @@ public:
virtual void Visit(BfExpressionStatement* exprStmt) override;
virtual void Visit(BfNamedExpression* namedExpr) override;
virtual void Visit(BfAttributedExpression* attribExpr) override;
virtual void Visit(BfStatement* stmt) override;
virtual void Visit(BfStatement* stmt) override;
virtual void Visit(BfLabelableStatement* labelableStmt) override;
virtual void Visit(BfCommentNode* commentNode) override;
virtual void Visit(BfPreprocesorIgnoredSectionNode* preprocesorIgnoredSection) override;
virtual void Visit(BfPreprocessorNode* preprocessorNode) override;
virtual void Visit(BfAttributeDirective* attributeDirective) override;
virtual void Visit(BfAttributeDirective* attributeDirective) override;
virtual void Visit(BfGenericParamsDeclaration* genericParams) override;
virtual void Visit(BfGenericOperatorConstraint* genericConstraints) override;
virtual void Visit(BfGenericConstraintsDeclaration* genericConstraints) override;
virtual void Visit(BfGenericArgumentsNode* genericArgumentsNode) override;
virtual void Visit(BfEmptyStatement* emptyStmt) override;
virtual void Visit(BfEmptyStatement* emptyStmt) override;
virtual void Visit(BfTokenNode* tokenNode) override;
virtual void Visit(BfTokenPairNode* tokenPairNode) override;
virtual void Visit(BfUsingSpecifierNode* usingSpecifier) override;
@ -156,7 +155,7 @@ public:
virtual void Visit(BfMixinExpression* mixinExpr) override;
virtual void Visit(BfSizedArrayCreateExpression* createExpr) override;
virtual void Visit(BfInitializerExpression* initExpr) override;
virtual void Visit(BfCollectionInitializerExpression* initExpr) override;
virtual void Visit(BfCollectionInitializerExpression* initExpr) override;
virtual void Visit(BfTypeReference* typeRef) override;
virtual void Visit(BfNamedTypeReference* typeRef) override;
virtual void Visit(BfQualifiedTypeReference* qualifiedType) override;
@ -172,7 +171,7 @@ public:
virtual void Visit(BfPointerTypeRef* typeRef) override;
virtual void Visit(BfNullableTypeRef* typeRef) override;
virtual void Visit(BfVariableDeclaration* varDecl) override;
virtual void Visit(BfParameterDeclaration* paramDecl) override;
virtual void Visit(BfParameterDeclaration* paramDecl) override;
virtual void Visit(BfTypeOfExpression* typeOfExpr) override;
virtual void Visit(BfSizeOfExpression* sizeOfExpr) override;
virtual void Visit(BfOffsetOfExpression* offsetOfExpr) override;
@ -181,11 +180,11 @@ public:
virtual void Visit(BfCheckTypeExpression* checkTypeExpr) override;
virtual void Visit(BfDynamicCastExpression* dynCastExpr) override;
virtual void Visit(BfCastExpression* castExpr) override;
virtual void Visit(BfDelegateBindExpression* invocationExpr) override;
virtual void Visit(BfDelegateBindExpression* invocationExpr) override;
virtual void Visit(BfLambdaBindExpression* lambdaBindExpr) override;
virtual void Visit(BfObjectCreateExpression* invocationExpr) override;
virtual void Visit(BfBoxExpression* boxExpr) override;
virtual void Visit(BfInvocationExpression* invocationExpr) override;
virtual void Visit(BfInvocationExpression* invocationExpr) override;
virtual void Visit(BfSwitchCase* switchCase) override;
virtual void Visit(BfWhenExpression* whenExpr) override;
virtual void Visit(BfSwitchStatement* switchStmt) override;

View file

@ -149,7 +149,7 @@ void BfReducer::ReplaceNode(BfAstNode* prevNode, BfAstNode* newNode)
if (!newNode->IsInitialized())
{
#ifdef BF_AST_COMPACT
#ifdef BF_AST_COMPACT
if (prevNode->mIsCompact)
{
newNode->mIsCompact = prevNode->mIsCompact;
@ -224,9 +224,8 @@ void BfReducer::AddErrorNode(BfAstNode* astNode, bool removeNode)
astNode->RemoveSelf();
}
bool BfReducer::IsTypeReference(BfAstNode* checkNode, BfToken successToken, int endNode, int* retryNode, int* outEndNode, bool* couldBeExpr, bool* isGenericType, bool* isTuple)
{
{
AssertCurrentNode(checkNode);
if (couldBeExpr != NULL)
@ -418,7 +417,7 @@ bool BfReducer::IsTypeReference(BfAstNode* checkNode, BfToken successToken, int
bool hadTupleComma = false;
bool hadIdentifier = false;
bool foundSuccessToken = false;
bool hadUnexpectedIdentifier = false;
bool hadUnexpectedIdentifier = false;
BfTokenNode* lastToken = NULL;
SizedArray<BfToken, 8> tokenStack;
@ -459,7 +458,7 @@ bool BfReducer::IsTypeReference(BfAstNode* checkNode, BfToken successToken, int
if ((doEnding) && (tokenStack.size() == 1))
doEnding = checkToken == tokenStack.back();
if (doEnding)
{
{
bool success = false;
if ((lastToken != NULL) && ((lastToken->GetToken() == BfToken_RChevron) || (lastToken->GetToken() == BfToken_RDblChevron)))
@ -469,7 +468,7 @@ bool BfReducer::IsTypeReference(BfAstNode* checkNode, BfToken successToken, int
}
if (successToken == BfToken_RParen)
{
{
success = (chevronDepth == 0) && (bracketDepth == 0) && (parenDepth == 1);
if (success)
@ -477,7 +476,7 @@ bool BfReducer::IsTypeReference(BfAstNode* checkNode, BfToken successToken, int
// Check identifierExpected - this catches (.) casts
if ((identifierExpected) && (couldBeExpr != NULL))
*couldBeExpr = false;
}
}
}
else if ((successToken == BfToken_Comma) ||
(successToken == BfToken_LBracket))
@ -575,7 +574,6 @@ bool BfReducer::IsTypeReference(BfAstNode* checkNode, BfToken successToken, int
return false;
}
}
}
else if ((checkToken == BfToken_Const) && (chevronDepth > 0))
{
@ -631,9 +629,9 @@ bool BfReducer::IsTypeReference(BfAstNode* checkNode, BfToken successToken, int
if (tokenStack.IsEmpty())
break;
for (int i = 0; i < ((checkToken == BfToken_RDblChevron) ? 2 : 1); i++)
{
{
if (tokenStack.back() != BfToken_RChevron)
{
if (outEndNode != NULL)
@ -900,7 +898,7 @@ bool BfReducer::IsTypeReference(BfAstNode* checkNode, BfToken successToken, int
else if ((checkToken == BfToken_DotDotDot) && (chevronDepth > 0))
{
isDone = true;
auto nextNode = mVisitorPos.Get(checkIdx + 1);
if (auto nextToken = BfNodeDynCast<BfTokenNode>(nextNode))
{
@ -910,7 +908,6 @@ bool BfReducer::IsTypeReference(BfAstNode* checkNode, BfToken successToken, int
}
else if (checkToken != BfToken_LBracket)
isDone = true;
if (isDone)
{
@ -961,7 +958,7 @@ bool BfReducer::IsTypeReference(BfAstNode* checkNode, BfToken successToken, int
{
// Allow
identifierExpected = false;
}
}
else
{
bool mayBeExprPart = false;
@ -1000,7 +997,7 @@ bool BfReducer::IsTypeReference(BfAstNode* checkNode, BfToken successToken, int
int retryNode = -1;
if (IsTypeReference(checkNode, successToken, endNode, &retryNode, outEndNode, couldBeExpr, isGenericType, isTuple))
return true;
if ((retryNode != -1) && (successToken == BfToken_None))
{
int newEndNode = -1;
@ -1063,7 +1060,6 @@ bool BfReducer::IsLocalMethod(BfAstNode* nameNode)
}
else
{
}
checkIdx++;
@ -1585,7 +1581,7 @@ BfExpression* BfReducer::CreateExpression(BfAstNode* node, CreateExprFlags creat
//if (!couldBeExpr)
{
auto endingTokenNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.Get(outEndNode - 1));
// If the type ends with a * or a ? then it could be an expression
// If the type ends with a * or a ? then it could be an expression
if (endingTokenNode == NULL)
{
isLocalVariable = true;
@ -1823,7 +1819,6 @@ BfExpression* BfReducer::CreateExpression(BfAstNode* node, CreateExprFlags creat
bool isLambdaBind = false;
bool isBoxing = false;
auto nextNode = mVisitorPos.GetNext();
if (auto nextTokenNode = BfNodeDynCast<BfTokenNode>(nextNode))
{
@ -1845,7 +1840,7 @@ BfExpression* BfReducer::CreateExpression(BfAstNode* node, CreateExprFlags creat
mVisitorPos.mReadPos--;
}
}
if (auto interpExpr = BfNodeDynCastExact<BfStringInterpolationExpression>(nextNode))
{
mVisitorPos.MoveNext();
@ -1854,8 +1849,8 @@ BfExpression* BfReducer::CreateExpression(BfAstNode* node, CreateExprFlags creat
interpExpr->mAllocNode = allocNode;
interpExpr->mTriviaStart = allocNode->mTriviaStart;
interpExpr->mSrcStart = allocNode->mSrcStart;
interpExpr->mSrcStart = allocNode->mSrcStart;
exprLeft = interpExpr;
}
else if (isBoxing)
@ -2000,7 +1995,7 @@ BfExpression* BfReducer::CreateExpression(BfAstNode* node, CreateExprFlags creat
auto expr = CreateExpressionAfter(isConstExpr);
MEMBER_SET_CHECKED(isConstExpr, mExpression, expr);
tokenNode = ExpectTokenAfter(isConstExpr, BfToken_RParen);
MEMBER_SET_CHECKED(isConstExpr, mCloseParen, tokenNode);
MEMBER_SET_CHECKED(isConstExpr, mCloseParen, tokenNode);
exprLeft = isConstExpr;
}
else if (token == BfToken_Question)
@ -2171,9 +2166,9 @@ BfExpression* BfReducer::CreateExpression(BfAstNode* node, CreateExprFlags creat
couldBeExpr = false;
isTuple = false;
if ((createExprFlags & CreateExprFlags_NoCast) == 0)
isCastExpr = IsTypeReference(node, BfToken_RParen, -1, &endNodeIdx, &couldBeExpr, NULL, &isTuple);
isCastExpr = IsTypeReference(node, BfToken_RParen, -1, &endNodeIdx, &couldBeExpr, NULL, &isTuple);
if (endNodeIdx != -1)
endNode = mVisitorPos.Get(endNodeIdx);
endNode = mVisitorPos.Get(endNodeIdx);
if (isCastExpr)
{
bool isValidTupleCast = false;
@ -2242,9 +2237,8 @@ BfExpression* BfReducer::CreateExpression(BfAstNode* node, CreateExprFlags creat
}
}
if (isCastExpr)
{
{
BfCastExpression* bfCastExpr = NULL;
if (isTuple)
{
@ -2284,7 +2278,7 @@ BfExpression* BfReducer::CreateExpression(BfAstNode* node, CreateExprFlags creat
unaryOpExpr = bfCastExpr;
}
}
if (!isCastExpr)
{
if (auto nextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
@ -2354,7 +2348,7 @@ BfExpression* BfReducer::CreateExpression(BfAstNode* node, CreateExprFlags creat
}
else if (tokenNode->GetToken() == BfToken_NameOf)
{
BfNameOfExpression* nameOfExpr = mAlloc->Alloc<BfNameOfExpression>();
BfNameOfExpression* nameOfExpr = mAlloc->Alloc<BfNameOfExpression>();
ReplaceNode(tokenNode, nameOfExpr);
nameOfExpr->mToken = tokenNode;
tokenNode = ExpectTokenAfter(nameOfExpr, BfToken_LParen);
@ -2364,7 +2358,7 @@ BfExpression* BfReducer::CreateExpression(BfAstNode* node, CreateExprFlags creat
int outEndNode = -1;
bool isTypeRef = IsTypeReference(mVisitorPos.GetCurrent(), BfToken_RParen, -1, &outEndNode);
mVisitorPos.mReadPos--;
if ((isTypeRef) && (outEndNode > 0))
{
if (auto tokenNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.Get(outEndNode - 1)))
@ -2375,17 +2369,17 @@ BfExpression* BfReducer::CreateExpression(BfAstNode* node, CreateExprFlags creat
auto typeRef = CreateTypeRefAfter(nameOfExpr);
MEMBER_SET_CHECKED(nameOfExpr, mTarget, typeRef);
}
}
}
}
if (nameOfExpr->mTarget == NULL)
{
auto expr = CreateExpressionAfter(nameOfExpr);
MEMBER_SET_CHECKED(nameOfExpr, mTarget, expr);
}
}
tokenNode = ExpectTokenAfter(nameOfExpr, BfToken_RParen);
MEMBER_SET_CHECKED(nameOfExpr, mCloseParen, tokenNode);
exprLeft = nameOfExpr;
exprLeft = nameOfExpr;
}
if (exprLeft == NULL)
@ -2393,7 +2387,7 @@ BfExpression* BfReducer::CreateExpression(BfAstNode* node, CreateExprFlags creat
BfUnaryOp unaryOp = BfTokenToUnaryOp(tokenNode->GetToken());
if (unaryOp != BfUnaryOp_None)
{
{
unaryOpExpr = mAlloc->Alloc<BfUnaryOperatorExpression>();
unaryOpExpr->mOp = unaryOp;
unaryOpExpr->mOpToken = tokenNode;
@ -2404,7 +2398,7 @@ BfExpression* BfReducer::CreateExpression(BfAstNode* node, CreateExprFlags creat
innerFlags = (CreateExprFlags)(innerFlags | (createExprFlags & CreateExprFlags_AllowVariableDecl));
if (unaryOp == BfUnaryOp_PartialRangeThrough) // This allows for just a naked '...'
innerFlags = (CreateExprFlags)(innerFlags | CreateExprFlags_AllowEmpty);
innerFlags = (CreateExprFlags)(innerFlags | CreateExprFlags_AllowEmpty);
// Don't attempt binary or unary operations- they will always be lower precedence
unaryOpExpr->mExpression = CreateExpressionAfter(unaryOpExpr, innerFlags);
@ -2432,7 +2426,7 @@ BfExpression* BfReducer::CreateExpression(BfAstNode* node, CreateExprFlags creat
if (auto assignmentExpr = BfNodeDynCast<BfAssignmentExpression>(unaryOpExpr->mExpression))
{
// Apply unary operator (likely a dereference) to LHS
// Apply unary operator (likely a dereference) to LHS
assignmentExpr->RemoveSelf();
ReplaceNode(unaryOpExpr, assignmentExpr);
if (assignmentExpr->mLeft != NULL)
@ -2495,23 +2489,23 @@ BfExpression* BfReducer::CreateExpression(BfAstNode* node, CreateExprFlags creat
{
BfToken token = tokenNode->GetToken();
if (((createExprFlags & CreateExprFlags_BreakOnRChevron) != 0) &&
if (((createExprFlags & CreateExprFlags_BreakOnRChevron) != 0) &&
((token == BfToken_RChevron) || (token == BfToken_RDblChevron)))
return exprLeft;
BfUnaryOp postUnaryOp = BfUnaryOp_None;
if (token == BfToken_DblPlus)
postUnaryOp = BfUnaryOp_PostIncrement;
if (token == BfToken_DblMinus)
postUnaryOp = BfUnaryOp_PostDecrement;
postUnaryOp = BfUnaryOp_PostDecrement;
if (token == BfToken_DotDotDot)
{
{
//TODO: Detect if this is a BfUnaryOp_PartialRangeFrom
}
if (postUnaryOp != BfUnaryOp_None)
{
{
auto unaryOpExpr = mAlloc->Alloc<BfUnaryOperatorExpression>();
ReplaceNode(exprLeft, unaryOpExpr);
unaryOpExpr->mOp = postUnaryOp;
@ -2523,7 +2517,7 @@ BfExpression* BfReducer::CreateExpression(BfAstNode* node, CreateExprFlags creat
}
if (token == BfToken_As)
{
{
auto dynCastExpr = mAlloc->Alloc<BfDynamicCastExpression>();
ReplaceNode(exprLeft, dynCastExpr);
dynCastExpr->mTarget = exprLeft;
@ -2537,7 +2531,7 @@ BfExpression* BfReducer::CreateExpression(BfAstNode* node, CreateExprFlags creat
}
if (token == BfToken_Is)
{
{
auto checkTypeExpr = mAlloc->Alloc<BfCheckTypeExpression>();
ReplaceNode(exprLeft, checkTypeExpr);
checkTypeExpr->mTarget = exprLeft;
@ -2788,7 +2782,7 @@ BfExpression* BfReducer::CreateExpression(BfAstNode* node, CreateExprFlags creat
continue;
}
// Could be a struct generic initializer, or a generic method invocation
// Could be a struct generic initializer, or a generic method invocation
if (auto outToken = BfNodeDynCast<BfTokenNode>(outNode))
{
int endNodeIdx = -1;
@ -2857,7 +2851,7 @@ BfExpression* BfReducer::CreateExpression(BfAstNode* node, CreateExprFlags creat
binOpExpression->mLeft = exprLeft;
binOpExpression->mOp = binOp;
MEMBER_SET(binOpExpression, mOpToken, tokenNode);
if (exprRight == NULL)
return binOpExpression;
MEMBER_SET(binOpExpression, mRight, exprRight);
@ -3239,7 +3233,7 @@ BfStatement* BfReducer::CreateForStatement(BfAstNode* node)
{
// Try to convert 'int i = 0, j = 0` into two variable declarations instead of a var decl and an assignment
if (auto prevExprStmt = BfNodeDynCast<BfExpressionStatement>(initializers.back()))
{
{
if (auto prevVarDecl = BfNodeDynCast<BfVariableDeclaration>(prevExprStmt->mExpression))
{
if (auto exprStmt = BfNodeDynCast<BfExpressionStatement>(stmt))
@ -3574,7 +3568,7 @@ BfSwitchStatement* BfReducer::CreateSwitchStatement(BfTokenNode* tokenNode)
token = tokenNode->GetToken();
if ((tokenNode == NULL) ||
((token != BfToken_Case) && (token != BfToken_When) && (token != BfToken_Default)))
{
{
Fail("Expected 'case'", child);
AddErrorNode(child);
isDone = !mVisitorPos.MoveNext();
@ -3623,7 +3617,7 @@ BfSwitchStatement* BfReducer::CreateSwitchStatement(BfTokenNode* tokenNode)
whenExpr->mWhenToken = whenToken;
ReplaceNode(whenToken, whenExpr);
//mVisitorPos.MoveNext();
//auto exprAfter = wasWhenSet ? (BfAstNode*)switchCase : (BfAstNode*)whenExpr;
//auto exprAfter = wasWhenSet ? (BfAstNode*)switchCase : (BfAstNode*)whenExpr;
if (expr == NULL)
{
auto innerExpr = CreateExpressionAfter(whenToken);
@ -3727,7 +3721,7 @@ BfSwitchStatement* BfReducer::CreateSwitchStatement(BfTokenNode* tokenNode)
{
int token = tokenNode->GetToken();
if ((token == BfToken_Case) || (token == BfToken_Default) || (token == BfToken_When))
break; // Done! No fallthrough
break; // Done! No fallthrough
}
nextNode = mVisitorPos.GetNext();
@ -3736,7 +3730,7 @@ BfSwitchStatement* BfReducer::CreateSwitchStatement(BfTokenNode* tokenNode)
hadEmptyCaseStatement = false;
mVisitorPos.MoveNext();
// We need to use CreateStmtFlags_NoCaseExpr because otherwise during typing a new statement at the end of one case, it
// We need to use CreateStmtFlags_NoCaseExpr because otherwise during typing a new statement at the end of one case, it
// could interpret the 'case' token for the next case as being part of a case expression in the first case
auto stmt = CreateStatement(nextNode, (CreateStmtFlags)(CreateStmtFlags_FindTrailingSemicolon | CreateStmtFlags_NoCaseExpr | CreateStmtFlags_AllowLocalFunction));
if (stmt == NULL)
@ -4113,7 +4107,7 @@ BfAstNode* BfReducer::DoCreateStatement(BfAstNode* node, CreateStmtFlags createS
{
auto flags = (CreateStmtFlags)(CreateStmtFlags_FindTrailingSemicolon | CreateStmtFlags_ForceVariableDecl);
if (token == BfToken_Static)
flags = (CreateStmtFlags)(flags | CreateStmtFlags_AllowLocalFunction);
flags = (CreateStmtFlags)(flags | CreateStmtFlags_AllowLocalFunction);
auto stmt = CreateStatementAfter(tokenNode, flags);
if (auto exprStmt = BfNodeDynCast<BfExpressionStatement>(stmt))
{
@ -4512,7 +4506,7 @@ bool BfReducer::IsTerminatingExpression(BfAstNode* node)
chevronDepth++;
break;
case BfToken_RChevron:
// If we find a < and > that are not separated by parens, that's a generic, which must be a
// If we find a < and > that are not separated by parens, that's a generic, which must be a
// variable decl if it's not in parens
if ((parenDepth == 0) && (chevronDepth > 0))
return false;
@ -5003,7 +4997,7 @@ BfTypeReference* BfReducer::DoCreateTypeRef(BfAstNode* firstNode, CreateTypeRefF
}
MEMBER_SET_CHECKED(delegateTypeRef, mCloseParen, closeNode);
mVisitorPos.MoveNext();
isHandled = true;
firstNode = delegateTypeRef;
@ -5026,7 +5020,7 @@ BfTypeReference* BfReducer::DoCreateTypeRef(BfAstNode* firstNode, CreateTypeRefF
firstNode = declTypeRef;
if ((createTypeRefFlags & CreateTypeRefFlags_EarlyExit) != 0)
return declTypeRef;
return declTypeRef;
}
else if (token == BfToken_LParen)
{
@ -5095,7 +5089,7 @@ BfTypeReference* BfReducer::DoCreateTypeRef(BfAstNode* firstNode, CreateTypeRefF
{
Fail("Expected type", firstNode);
return NULL;
}
}
}
}
@ -5518,7 +5512,7 @@ BfIdentifierNode* BfReducer::CompactQualifiedName(BfAstNode* leftNode)
auto rightIdentifier = BfNodeDynCast<BfIdentifierNode>(nextNextToken);
if (rightIdentifier == NULL)
{
if (auto rightToken = BfNodeDynCast<BfTokenNode>(nextNextToken))
if (auto rightToken = BfNodeDynCast<BfTokenNode>(nextNextToken))
{
if (BfTokenIsKeyword(rightToken->mToken))
{
@ -5526,16 +5520,16 @@ BfIdentifierNode* BfReducer::CompactQualifiedName(BfAstNode* leftNode)
ReplaceNode(rightToken, rightIdentifier);
}
}
if (rightIdentifier == NULL)
return leftIdentifier;
}
// If the previous dotted span failed (IE: had chevrons) then don't insert qualified names in the middle of it
auto prevNodeToken = BfNodeDynCast<BfTokenNode>(prevNode);
if ((prevNodeToken != NULL) &&
((prevNodeToken->GetToken() == BfToken_Dot) ||
(prevNodeToken->GetToken() == BfToken_QuestionDot) ||
if ((prevNodeToken != NULL) &&
((prevNodeToken->GetToken() == BfToken_Dot) ||
(prevNodeToken->GetToken() == BfToken_QuestionDot) ||
(prevNodeToken->GetToken() == BfToken_Arrow)))
return leftIdentifier;
@ -5566,7 +5560,7 @@ void BfReducer::TryIdentifierConvert(int readPos)
ReplaceNode(tokenNode, identifierNode);
mVisitorPos.Set(readPos, identifierNode);
}
}
}
}
void BfReducer::CreateQualifiedNames(BfAstNode* node)
@ -5691,7 +5685,7 @@ Do_RBracket:
mVisitorPos.MoveNext();
}
// Has another one- chain it
// Has another one- chain it
auto nextAttribute = CreateAttributeDirective(tokenNode);
if (nextAttribute != NULL)
{
@ -5706,14 +5700,14 @@ BfStatement* BfReducer::CreateAttributedStatement(BfTokenNode* tokenNode, Create
auto attrib = CreateAttributeDirective(tokenNode);
if (attrib == NULL)
return NULL;
BfAstNode* stmt = CreateStatementAfter(attrib, createStmtFlags);
if (stmt != NULL)
{
{
if (auto localMethodDecl = BfNodeDynCastExact<BfLocalMethodDeclaration>(stmt))
{
BF_ASSERT(localMethodDecl->mMethodDeclaration->mAttributes == NULL);
localMethodDecl->mSrcStart = attrib->mSrcStart;
localMethodDecl->mSrcStart = attrib->mSrcStart;
MEMBER_SET(localMethodDecl->mMethodDeclaration, mAttributes, attrib);
return localMethodDecl;
}
@ -5755,7 +5749,7 @@ BfExpression* BfReducer::CreateAttributedExpression(BfTokenNode* tokenNode, bool
return NULL;
if (!onlyAllowIdentifier)
{
{
BfExpression* expr = CreateExpressionAfter(attrib, CreateExprFlags_EarlyExit);
if (expr != NULL)
{
@ -5780,7 +5774,7 @@ BfExpression* BfReducer::CreateAttributedExpression(BfTokenNode* tokenNode, bool
MEMBER_SET(attribExpr, mExpression, expr);
return attribExpr;
}
}
}
Fail("Prefixed attributes can only be used on allocations, invocations, blocks, or variable declarations", attrib);
@ -6156,7 +6150,7 @@ BfAstNode* BfReducer::ReadTypeMember(BfTokenNode* tokenNode, bool declStarted, i
ReplaceNode(tokenNode, ctorDecl);
MEMBER_SET(ctorDecl, mThisToken, tokenNode);
if (auto block = BfNodeDynCast<BfBlock>(mVisitorPos.GetNext()))
{
{
mVisitorPos.MoveNext();
MEMBER_SET(ctorDecl, mBody, block);
@ -6443,7 +6437,7 @@ BfAstNode* BfReducer::ReadTypeMember(BfTokenNode* tokenNode, bool declStarted, i
}
}
SetProtection(memberDecl, memberDecl->mProtectionSpecifier, tokenNode);
SetProtection(memberDecl, memberDecl->mProtectionSpecifier, tokenNode);
return memberDecl;
}
@ -6549,7 +6543,7 @@ BfAstNode* BfReducer::ReadTypeMember(BfTokenNode* tokenNode, bool declStarted, i
{
if (token == BfToken_Override)
{
// Must be typing an 'override' over a field declaration
// Must be typing an 'override' over a field declaration
auto propDecl = mAlloc->Alloc<BfPropertyDeclaration>();
propDecl->mVirtualSpecifier = tokenNode;
typeMember = memberDecl = propDecl;
@ -6584,7 +6578,7 @@ BfAstNode* BfReducer::ReadTypeMember(BfTokenNode* tokenNode, bool declStarted, i
auto usingSpecifier = mAlloc->Alloc<BfUsingSpecifierNode>();
ReplaceNode(tokenNode, usingSpecifier);
MEMBER_SET(usingSpecifier, mUsingToken, tokenNode);
MEMBER_SET(usingSpecifier, mUsingToken, tokenNode);
MEMBER_SET(fieldDecl, mConstSpecifier, usingSpecifier);
handled = true;
}
@ -6759,10 +6753,10 @@ void BfReducer::ReadPropertyBlock(BfPropertyDeclaration* propertyDeclaration, Bf
BfAstNode* bodyAfterNode = accessorIdentifier;
BfAstNode* body = NULL;
auto tokenNode = BfNodeDynCast<BfTokenNode>(child);
if ((tokenNode != NULL) && (tokenNode->GetToken() == BfToken_Ref) && (accessorName == "set"))
{
{
refSpecifier = tokenNode;
bodyAfterNode = tokenNode;
@ -6782,8 +6776,8 @@ void BfReducer::ReadPropertyBlock(BfPropertyDeclaration* propertyDeclaration, Bf
mVisitorPos.MoveNext();
child = mVisitorPos.GetNext();
}
}
bool handled = false;
BfTokenNode* fatArrowToken = NULL;
BfAstNode* endSemicolon = NULL;
@ -6796,7 +6790,7 @@ void BfReducer::ReadPropertyBlock(BfPropertyDeclaration* propertyDeclaration, Bf
mVisitorPos.MoveNext();
}
else if (tokenNode->mToken == BfToken_FatArrow)
{
{
handled = true;
fatArrowToken = tokenNode;
mVisitorPos.MoveNext();
@ -6806,9 +6800,9 @@ void BfReducer::ReadPropertyBlock(BfPropertyDeclaration* propertyDeclaration, Bf
{
body = expr;
endSemicolon = ExpectTokenAfter(expr, BfToken_Semicolon);
}
}
}
}
}
if (!handled)
{
@ -6822,7 +6816,7 @@ void BfReducer::ReadPropertyBlock(BfPropertyDeclaration* propertyDeclaration, Bf
{
body = accessorBlock;
mVisitorPos.MoveNext();
}
}
if (body == NULL)
{
if (child != NULL)
@ -6831,7 +6825,7 @@ void BfReducer::ReadPropertyBlock(BfPropertyDeclaration* propertyDeclaration, Bf
AddErrorNode(child);
mVisitorPos.MoveNext();
}
}
}
}
}
@ -6859,7 +6853,7 @@ void BfReducer::ReadPropertyBlock(BfPropertyDeclaration* propertyDeclaration, Bf
auto method = mAlloc->Alloc<BfPropertyMethodDeclaration>();
method->mPropertyDeclaration = propertyDeclaration;
if (fatArrowToken != NULL)
MEMBER_SET(method, mFatArrowToken, fatArrowToken);
if (endSemicolon != NULL)
@ -6897,12 +6891,12 @@ BfAstNode* BfReducer::ReadTypeMember(BfAstNode* node, bool declStarted, int dept
BfTokenNode* refToken = NULL;
if (auto tokenNode = BfNodeDynCast<BfTokenNode>(node))
{
{
BfToken token = tokenNode->GetToken();
bool isTypeRef = false;
if ((token == BfToken_Delegate) || (token == BfToken_Function))
{
// We need to differentiate between a delegate type reference and a delegate type declaration
// We need to differentiate between a delegate type reference and a delegate type declaration
int endNodeIdx = -1;
if (IsTypeReference(node, BfToken_LParen, -1, &endNodeIdx))
{
@ -6939,7 +6933,7 @@ BfAstNode* BfReducer::ReadTypeMember(BfAstNode* node, bool declStarted, int dept
}
else
{
SetAndRestoreValue<BfAstNode*> prevTypeMemberNodeStart(mTypeMemberNodeStart, tokenNode, !declStarted);
SetAndRestoreValue<BfAstNode*> prevTypeMemberNodeStart(mTypeMemberNodeStart, tokenNode, !declStarted);
return ReadTypeMember(tokenNode, declStarted, depth, deferredHeadNode);
}
}
@ -6992,7 +6986,6 @@ BfAstNode* BfReducer::ReadTypeMember(BfAstNode* node, bool declStarted, int dept
node = typeRef;
auto nextNode = mVisitorPos.GetNext();
if (auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode))
{
@ -7146,7 +7139,7 @@ BfAstNode* BfReducer::ReadTypeMember(BfAstNode* node, bool declStarted, int dept
}
ParseMethod(operatorDecl, &params, &commas);
if (params.size() == 1)
{
if (operatorDecl->mBinOp == BfBinaryOp_Add)
@ -7158,7 +7151,7 @@ BfAstNode* BfReducer::ReadTypeMember(BfAstNode* node, bool declStarted, int dept
{
operatorDecl->mBinOp = BfBinaryOp_None;
operatorDecl->mUnaryOp = BfUnaryOp_Negate;
}
}
}
return operatorDecl;
@ -7235,7 +7228,7 @@ BfAstNode* BfReducer::ReadTypeMember(BfAstNode* node, bool declStarted, int dept
// If we don't have a token afterwards then still treat it as a property for autocomplete purposes
if ((typeRef != NULL) &&
((block != NULL) || (tokenNode == NULL) || (isExprBodyProp)))
{
{
if (propertyDeclaration == NULL)
{
if ((block == NULL) && (!isExprBodyProp))
@ -7255,7 +7248,7 @@ BfAstNode* BfReducer::ReadTypeMember(BfAstNode* node, bool declStarted, int dept
//mVisitorPos.mReadPos--;
// WHY did we want to not set this?
// If we don't, then typing a new method name will end up treating the name node as a typeRef
// If we don't, then typing a new method name will end up treating the name node as a typeRef
// which can autocomplete incorrectly
MEMBER_SET(propDecl, mNameNode, nameIdentifier);
@ -7320,7 +7313,7 @@ BfAstNode* BfReducer::ReadTypeMember(BfAstNode* node, bool declStarted, int dept
if (tokenNode->mToken == BfToken_Mut)
{
MEMBER_SET(propertyBodyExpr, mMutSpecifier, tokenNode);
tokenNode = ExpectTokenAfter(tokenNode, BfToken_FatArrow);
tokenNode = ExpectTokenAfter(tokenNode, BfToken_FatArrow);
}
if (tokenNode != NULL)
@ -7383,7 +7376,7 @@ BfAstNode* BfReducer::ReadTypeMember(BfAstNode* node, bool declStarted, int dept
{
if (token == BfToken_LChevron)
{
bool isTypeRef = IsTypeReference(nameIdentifier, BfToken_LParen);
bool isTypeRef = IsTypeReference(nameIdentifier, BfToken_LParen);
if (!isTypeRef)
{
bool onNewLine = false;
@ -7395,7 +7388,7 @@ BfAstNode* BfReducer::ReadTypeMember(BfAstNode* node, bool declStarted, int dept
if (onNewLine)
{
// Actually it looks like a partially formed type declaration followed by a method
// Actually it looks like a partially formed type declaration followed by a method
// which returns a generic type
FailAfter("Name expected", typeRef);
@ -7543,7 +7536,7 @@ BfInitializerExpression* BfReducer::TryCreateInitializerExpression(BfAstNode* ta
SetAndRestoreValue<BfVisitorPos> prevVisitorPos(mVisitorPos, BfVisitorPos(block));
bool isDone = !mVisitorPos.MoveNext();
BfDeferredAstNodeSizedArray<BfExpression*> values(initializerExpr, initializerExpr->mValues, mAlloc);
BfDeferredAstNodeSizedArray<BfTokenNode*> commas(initializerExpr, initializerExpr->mCommas, mAlloc);
@ -7575,12 +7568,12 @@ BfInitializerExpression* BfReducer::TryCreateInitializerExpression(BfAstNode* ta
}
}
}
}
}
mVisitorPos.Trim();
if (block->mCloseBrace != NULL)
MEMBER_SET(initializerExpr, mCloseBrace, block->mCloseBrace);
MEMBER_SET(initializerExpr, mCloseBrace, block->mCloseBrace);
return initializerExpr;
}
@ -7843,7 +7836,7 @@ bool BfReducer::SetProtection(BfAstNode* parentNode, BfAstNode*& protectionNodeR
((prevToken->mToken == BfToken_Internal) && (tokenNode->mToken == BfToken_Protected)))
{
auto tokenPair = mAlloc->Alloc<BfTokenPairNode>();
if (prevToken->mSrcStart < tokenNode->mSrcStart)
{
ReplaceNode(prevToken, tokenPair);
@ -7863,7 +7856,7 @@ bool BfReducer::SetProtection(BfAstNode* parentNode, BfAstNode*& protectionNodeR
return true;
}
}
Fail("Protection already specified", protectionNodeRef);
}
protectionNodeRef = tokenNode;
@ -8017,7 +8010,6 @@ BfAstNode* BfReducer::CreateAllocNode(BfTokenNode* allocToken)
MEMBER_SET(newNode, mAllocNode, identifier);
mVisitorPos.MoveNext();
}
}
}
@ -8112,7 +8104,7 @@ BfObjectCreateExpression* BfReducer::CreateObjectCreateExpression(BfAstNode* all
MEMBER_SET(objectCreateExpr, mCloseToken, block->mCloseBrace);
objectCreateExpr->mSrcEnd = block->mSrcEnd;
return objectCreateExpr;
}
}
if (isArray)
{
@ -8127,13 +8119,13 @@ BfObjectCreateExpression* BfReducer::CreateObjectCreateExpression(BfAstNode* all
}
else
{
// Note- if there WERE an LBracket here then we'd have an 'isArray' case. We pass this in here for
// Note- if there WERE an LBracket here then we'd have an 'isArray' case. We pass this in here for
// error display purposes
tokenNode = ExpectTokenAfter(objectCreateExpr, BfToken_LParen, BfToken_LBracket);
if (tokenNode == NULL)
return objectCreateExpr;
}
MEMBER_SET(objectCreateExpr, mOpenToken, tokenNode);
BfToken endToken = (BfToken)(tokenNode->GetToken() + 1);
@ -8141,7 +8133,7 @@ BfObjectCreateExpression* BfReducer::CreateObjectCreateExpression(BfAstNode* all
if (tokenNode == NULL)
return objectCreateExpr;
MEMBER_SET(objectCreateExpr, mCloseToken, tokenNode);
return objectCreateExpr;
}
@ -8175,7 +8167,7 @@ BfExpression* BfReducer::CreateIndexerExpression(BfExpression* target)
if (attributeDirective != NULL)
{
BfAttributedExpression* attribExpr = mAlloc->Alloc<BfAttributedExpression>();
ReplaceNode(indexerExpr, attribExpr);
ReplaceNode(indexerExpr, attribExpr);
attribExpr->mExpression = indexerExpr;
MEMBER_SET(attribExpr, mAttributes, attributeDirective);
return attribExpr;
@ -8340,16 +8332,16 @@ BfAstNode* BfReducer::HandleTopLevel(BfBlock* node)
bool hadPrevFail = false;
bool isDone = !mVisitorPos.MoveNext();
auto parser = mSource->ToParser();
if ((parser != NULL) && (parser->mEmbedKind == BfSourceEmbedKind_Type))
{
{
while (!isDone)
{
auto node = mVisitorPos.GetCurrent();
if (node == prevNode)
{
{
// If we're stuck on an error and can't process any more nodes
break;
}
@ -8418,7 +8410,7 @@ BfAstNode* BfReducer::HandleTopLevel(BfBlock* node)
isDone = !mVisitorPos.MoveNext();
if (newNode != NULL)
mVisitorPos.Write(newNode);
mVisitorPos.Write(newNode);
}
mVisitorPos.Trim();
return node;
@ -8503,7 +8495,7 @@ BfAstNode* BfReducer::CreateTopLevelObject(BfTokenNode* tokenNode, BfAttributeDi
break;
}
}
}
}
else if ((bracketDepth > 0) || (parenDepth > 0))
{
// Allow
@ -8627,7 +8619,7 @@ BfAstNode* BfReducer::CreateTopLevelObject(BfTokenNode* tokenNode, BfAttributeDi
bodyNode = ExpectTokenAfter(namespaceDeclaration, BfToken_Semicolon);
else
bodyNode = blockNode = ExpectBlockAfter(namespaceDeclaration);
if (bodyNode == NULL)
return namespaceDeclaration;
MoveNode(bodyNode, namespaceDeclaration);
@ -8653,7 +8645,7 @@ BfAstNode* BfReducer::CreateTopLevelObject(BfTokenNode* tokenNode, BfAttributeDi
FailAfter("Expected type declaration", tokenNode);
return NULL;
}
mVisitorPos.MoveNext();
auto topLevelObject = CreateTopLevelObject(nextToken, attributes);
if (topLevelObject == NULL)
@ -8674,7 +8666,7 @@ BfAstNode* BfReducer::CreateTopLevelObject(BfTokenNode* tokenNode, BfAttributeDi
break;
case BfToken_Sealed:
case BfToken_Abstract:
case BfToken_Abstract:
case BfToken_Public:
case BfToken_Private:
case BfToken_Protected:
@ -8707,7 +8699,7 @@ BfAstNode* BfReducer::CreateTopLevelObject(BfTokenNode* tokenNode, BfAttributeDi
return NULL;
}
mVisitorPos.MoveNext();
auto topLevelObject = CreateTopLevelObject(nextToken, attributes);
if (topLevelObject == NULL)
{
@ -8731,7 +8723,7 @@ BfAstNode* BfReducer::CreateTopLevelObject(BfTokenNode* tokenNode, BfAttributeDi
(token == BfToken_Private) ||
(token == BfToken_Internal))
{
SetProtection(typeDeclaration, typeDeclaration->mProtectionSpecifier, tokenNode);
SetProtection(typeDeclaration, typeDeclaration->mProtectionSpecifier, tokenNode);
}
if (token == BfToken_Static)
@ -8822,8 +8814,6 @@ BfAstNode* BfReducer::CreateTopLevelObject(BfTokenNode* tokenNode, BfAttributeDi
//MEMBER_SET(methodDecl, mReturnType, retType);
return typeDeclaration;
}
break;
@ -8961,15 +8951,15 @@ BfAstNode* BfReducer::CreateTopLevelObject(BfTokenNode* tokenNode, BfAttributeDi
{
if (tokenNode->mToken == BfToken_This)
{
mVisitorPos.MoveNext();
mVisitorPos.MoveNext();
auto ctorDecl = mAlloc->Alloc<BfAutoConstructorDeclaration>();
BfDeferredAstSizedArray<BfParameterDeclaration*> params(ctorDecl->mParams, mAlloc);
BfDeferredAstSizedArray<BfTokenNode*> commas(ctorDecl->mCommas, mAlloc);
ctorDecl->mReturnType = NULL;
ReplaceNode(tokenNode, ctorDecl);
MEMBER_SET(ctorDecl, mThisToken, tokenNode);
MEMBER_SET(ctorDecl, mThisToken, tokenNode);
ParseMethod(ctorDecl, &params, &commas);
if (typeDeclaration->mAutoCtor == NULL)
{
MEMBER_SET(typeDeclaration, mAutoCtor, ctorDecl);
@ -9098,7 +9088,7 @@ BfAstNode* BfReducer::CreateTopLevelObject(BfTokenNode* tokenNode, BfAttributeDi
if (child == NULL)
break;
auto fieldDecl = mAlloc->Alloc<BfEnumEntryDeclaration>();
if (auto tokenNode = BfNodeDynCast<BfTokenNode>(child))
{
if (tokenNode->mToken == BfToken_LBracket)
@ -9114,7 +9104,7 @@ BfAstNode* BfReducer::CreateTopLevelObject(BfTokenNode* tokenNode, BfAttributeDi
break;
}
}
}
}
mVisitorPos.MoveNext();
mVisitorPos.Write(fieldDecl);
@ -9351,7 +9341,7 @@ BfCommentNode * BfReducer::FindDocumentation(BfAstNode* defNodeHead, BfAstNode*
return NULL;
}
if ((checkComment->mCommentKind != BfCommentKind_Documentation_Line_Pre) &&
if ((checkComment->mCommentKind != BfCommentKind_Documentation_Line_Pre) &&
(checkComment->mCommentKind != BfCommentKind_Documentation_Block_Pre))
{
// Skip this, not used
@ -9422,7 +9412,7 @@ BfTokenNode* BfReducer::ParseMethodParams(BfAstNode* node, SizedArrayImpl<BfPara
if ((paramIdx == 0) && (
(token == BfToken_In) || (token == BfToken_Out) || (token == BfToken_Ref) || (token == BfToken_Mut) ||
(token == BfToken_Delegate) || (token == BfToken_Function) ||
(token == BfToken_Comptype) || (token == BfToken_Decltype) ||
(token == BfToken_Comptype) || (token == BfToken_Decltype) ||
(token == BfToken_AllocType) || (token == BfToken_RetType) ||
(token == BfToken_Params) || (token == BfToken_LParen) ||
(token == BfToken_Var) || (token == BfToken_LBracket) ||
@ -9480,7 +9470,7 @@ BfTokenNode* BfReducer::ParseMethodParams(BfAstNode* node, SizedArrayImpl<BfPara
BfToken token = tokenNode->GetToken();
if ((token == BfToken_Var) || (token == BfToken_LParen) ||
(token == BfToken_Delegate) || (token == BfToken_Function) ||
(token == BfToken_Comptype) || (token == BfToken_Decltype) ||
(token == BfToken_Comptype) || (token == BfToken_Decltype) ||
(token == BfToken_AllocType) || (token == BfToken_RetType) ||
(token == BfToken_DotDotDot))
{
@ -9690,7 +9680,7 @@ BfTokenNode* BfReducer::ParseMethodParams(BfAstNode* node, SizedArrayImpl<BfPara
isFunction = true;
else
isDelegate = true;
}
}
else if ((mCurTypeDecl->mTypeNode != NULL) && (mCurTypeDecl->mTypeNode->GetToken() == BfToken_Function))
isFunction = true;
else if ((mCurTypeDecl->mTypeNode != NULL) && (mCurTypeDecl->mTypeNode->GetToken() == BfToken_Delegate))
@ -9728,13 +9718,13 @@ BfTokenNode* BfReducer::ParseMethodParams(BfAstNode* node, SizedArrayImpl<BfPara
if (nameIdentifierNode != NULL)
mVisitorPos.MoveNext();
}
if (nameIdentifierNode != NULL)
{
paramDecl->mNameNode = nameIdentifierNode;
MoveNode(nameIdentifierNode, paramDecl);
nameAfterNode = nameIdentifierNode;
}
nameAfterNode = nameIdentifierNode;
}
}
node->mSrcEnd = paramDecl->mSrcEnd;
@ -9803,7 +9793,7 @@ bool BfReducer::ParseMethod(BfMethodDeclaration* methodDeclaration, SizedArrayIm
methodDeclaration->mCloseParen = ParseMethodParams(methodDeclaration, params, commas, BfToken_RParen, true);
// RParen
// RParen
if (methodDeclaration->mCloseParen == NULL)
{
auto nextNode = mVisitorPos.GetNext();
@ -9908,7 +9898,7 @@ bool BfReducer::ParseMethod(BfMethodDeclaration* methodDeclaration, SizedArrayIm
if (ctorDecl->mInitializer != NULL)
{
MEMBER_SET(attribExpr, mExpression, ctorDecl->mInitializer);
}
}
MEMBER_SET(ctorDecl, mInitializer, attribExpr);
}
}
@ -10121,44 +10111,44 @@ BfGenericConstraintsDeclaration* BfReducer::CreateGenericConstraintsDeclaration(
// ReplaceNode(tokenNode, genericConstraint);
// genericConstraint->mWhereToken = tokenNode;
// constraintsDeclaration->mHasExpressions = true;
//
//
// genericConstraintsArr.push_back(genericConstraint);
//
//
// auto expr = CreateExpressionAfter(genericConstraint, CreateExprFlags_EarlyExit);
// if (expr == NULL)
// break;
//
// MEMBER_SET(genericConstraint, mExpression, expr);
//
//
// MEMBER_SET(genericConstraint, mExpression, expr);
//
// BfTokenNode* nextWhereToken = NULL;
// if (auto checkToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
// {
// if (checkToken->mToken != BfToken_Where)
// nextWhereToken = checkToken;
// }
//
//
// auto nextNode = mVisitorPos.GetNext();
// if (BfNodeDynCast<BfBlock>(nextNode))
// break;
//
// if (BfNodeDynCast<BfBlock>(nextNode))
// break;
//
// bool handled = false;
// if (auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode))
// {
// if (tokenNode->mToken == BfToken_FatArrow)
// break;
// if (tokenNode->mToken == BfToken_FatArrow)
// break;
// }
//
//
// tokenNode = ExpectTokenAfter(genericConstraint, BfToken_LBrace, BfToken_Where, BfToken_Semicolon);
// if (tokenNode == NULL)
// if (tokenNode == NULL)
// break;
//
//
// BfToken token = tokenNode->GetToken();
// if (token != BfToken_Where)
// {
// if (token != BfToken_Where)
// {
// mVisitorPos.mReadPos--;
// break;
// }
//
//
// continue;
// }
// }
@ -10170,7 +10160,7 @@ BfGenericConstraintsDeclaration* BfReducer::CreateGenericConstraintsDeclaration(
ReplaceNode(tokenNode, genericConstraint);
genericConstraint->mWhereToken = tokenNode;
genericConstraintsArr.push_back(genericConstraint);
genericConstraintsArr.push_back(genericConstraint);
auto genericParamName = CreateTypeRefAfter(genericConstraint);
if (genericParamName != NULL)
@ -10206,7 +10196,7 @@ BfGenericConstraintsDeclaration* BfReducer::CreateGenericConstraintsDeclaration(
{
isDone = true;
break;
}
}
}
tokenNode = ExpectTokenAfter(genericConstraint, BfToken_Comma, BfToken_LBrace, BfToken_Where, BfToken_Semicolon);
@ -10960,4 +10950,4 @@ BfInlineAsmStatement* BfReducer::CreateInlineAsmStatement(BfAstNode* asmNode)
}
return asmStatement;
}
}

View file

@ -36,8 +36,8 @@ public:
CreateStmtFlags_NoCaseExpr = 1,
CreateStmtFlags_FindTrailingSemicolon = 2,
CreateStmtFlags_AllowUnterminatedExpression = 4,
CreateStmtFlags_AllowLocalFunction = 8,
CreateStmtFlags_ForceVariableDecl = 0x10,
CreateStmtFlags_AllowLocalFunction = 8,
CreateStmtFlags_ForceVariableDecl = 0x10,
CreateStmtFlags_To_CreateExprFlags_Mask = 1
};
@ -127,7 +127,7 @@ public:
}
};
public:
public:
BfAstAllocator* mAlloc;
BfSystem* mSystem;
BfSource* mSource;
@ -141,12 +141,12 @@ public:
BfMethodDeclaration* mCurMethodDecl;
BfAstNode* mLastBlockNode;
bool mStmtHasError;
bool mPrevStmtHadError;
bool mPrevStmtHadError;
bool mCompatMode; // Does C++ compatible parsing
bool mAllowTypeWildcard;
bool mIsFieldInitializer;
bool mInParenExpr;
bool mSkipCurrentNodeAssert;
bool mSkipCurrentNodeAssert;
BfVisitorPos mVisitorPos;
int mDocumentCheckIdx;
SizedArray<BfNamespaceDeclaration*, 4> mCurNamespaceStack;
@ -154,15 +154,15 @@ public:
int mAssertCurrentNodeIdx;
public:
public:
BfAstNode* Fail(const StringImpl& errorMsg, BfAstNode* refNode);
BfAstNode* FailAfter(const StringImpl& errorMsg, BfAstNode* refNode);
void AddErrorNode(BfAstNode* astNode, bool removeNode = true);
public:
public:
bool StringEquals(BfAstNode* node, BfAstNode* node2);
bool IsSemicolon(BfAstNode* node);
BfTokenNode* ExpectTokenAfter(BfAstNode* node, BfToken token);
BfTokenNode* ExpectTokenAfter(BfAstNode* node, BfToken token);
BfTokenNode* ExpectTokenAfter(BfAstNode* node, BfToken tokenA, BfToken tokenB);
BfTokenNode* ExpectTokenAfter(BfAstNode* node, BfToken tokenA, BfToken tokenB, BfToken tokenC);
BfTokenNode* ExpectTokenAfter(BfAstNode* node, BfToken tokenA, BfToken tokenB, BfToken tokenC, BfToken tokenD);
@ -176,8 +176,8 @@ public:
bool IsNodeRelevant(BfAstNode* astNode);
bool IsNodeRelevant(BfAstNode* startNode, BfAstNode* endNode);
void MoveNode(BfAstNode* srcNode, BfAstNode* newOwner);
void ReplaceNode(BfAstNode* prevNode, BfAstNode* newNode);
void ReplaceNode(BfAstNode* prevNode, BfAstNode* newNode);
bool SetProtection(BfAstNode* parentNode, BfAstNode*& protectionNodeRef, BfTokenNode* tokenNode);
BfAstNode* CreateAllocNode(BfTokenNode* newNode);
BfAstNode* ReplaceTokenStarter(BfAstNode* astNode, int idx = -1, bool allowIn = false);
@ -195,12 +195,12 @@ public:
void CreateQualifiedNames(BfAstNode* node);
BfFieldDtorDeclaration* CreateFieldDtorDeclaration(BfAstNode* srcNode);
BfFieldDeclaration* CreateFieldDeclaration(BfTokenNode* tokenNode, BfTypeReference* typeRef, BfIdentifierNode* nameIdentifier, BfFieldDeclaration* prevFieldDeclaration);
BfAttributeDirective* CreateAttributeDirective(BfTokenNode* startToken);
BfAttributeDirective* CreateAttributeDirective(BfTokenNode* startToken);
BfStatement* CreateAttributedStatement(BfTokenNode* tokenNode, CreateStmtFlags createStmtFlags = CreateStmtFlags_None);
BfExpression* CreateAttributedExpression(BfTokenNode* tokenNode, bool onlyAllowIdentifier);
BfDelegateBindExpression* CreateDelegateBindExpression(BfAstNode* allocNode);
BfLambdaBindExpression* CreateLambdaBindExpression(BfAstNode* allocNode, BfTokenNode* parenToken = NULL);
BfCollectionInitializerExpression* CreateCollectionInitializerExpression(BfBlock* block);
BfCollectionInitializerExpression* CreateCollectionInitializerExpression(BfBlock* block);
BfCollectionInitializerExpression* CreateCollectionInitializerExpression(BfTokenNode* openToken);
BfObjectCreateExpression* CreateObjectCreateExpression(BfAstNode* allocNode);
BfScopedInvocationTarget* CreateScopedInvocationTarget(BfAstNode*& targetRef, BfTokenNode* colonToken);
@ -225,7 +225,7 @@ public:
BfTypeReference* DoCreateTypeRef(BfAstNode* identifierNode, CreateTypeRefFlags createTypeRefFlags = CreateTypeRefFlags_None, int endNode = -1);
BfTypeReference* CreateTypeRef(BfAstNode* identifierNode, CreateTypeRefFlags createTypeRefFlags = CreateTypeRefFlags_None);
BfTypeReference* CreateTypeRefAfter(BfAstNode* astNode, CreateTypeRefFlags createTypeRefFlags = CreateTypeRefFlags_None);
BfTypeReference* CreateRefTypeRef(BfTypeReference* elementType, BfTokenNode* refToken);
BfTypeReference* CreateRefTypeRef(BfTypeReference* elementType, BfTokenNode* refToken);
bool ParseMethod(BfMethodDeclaration* methodDeclaration, SizedArrayImpl<BfParameterDeclaration*>* params, SizedArrayImpl<BfTokenNode*>* commas, bool alwaysIncludeBlock = false);
BfGenericArgumentsNode* CreateGenericArguments(BfTokenNode* tokenNode, bool allowPartial = false);
BfGenericParamsDeclaration* CreateGenericParamsDeclaration(BfTokenNode* tokenNode);

View file

@ -1,14 +1,14 @@
#include "BfResolvePass.h"
#include "BfResolvePass.h"
#include "BfParser.h"
#include "BfModule.h"
USING_NS_BF;
BfResolvePassData::BfResolvePassData()
{
{
mGetSymbolReferenceKind = BfGetSymbolReferenceKind_None;
mSymbolReferenceTypeDef = NULL;
mSymbolReferenceTypeDef = NULL;
mSymbolReferenceLocalIdx = -1;
mSymbolReferenceFieldIdx = -1;
@ -31,7 +31,7 @@ BfResolvePassData::~BfResolvePassData()
auto parser = emitEntryKV.mValue.mParser;
if (parser != NULL)
{
delete parser->mSourceClassifier;
delete parser->mSourceClassifier;
parser->mSourceClassifier = NULL;
parser->mParserFlags = ParserFlag_None;
parser->mCursorCheckIdx = -1;
@ -56,7 +56,7 @@ void BfResolvePassData::RecordReplaceNode(BfAstNode* node)
auto parser = node->GetSourceData()->ToParserData();
if (node->GetSrcStart() >= parser->mSrcLength)
return;
while (true)
{
if (auto qualifiedName = BfNodeDynCast<BfQualifiedNameNode>(node))
@ -65,35 +65,35 @@ void BfResolvePassData::RecordReplaceNode(BfAstNode* node)
}
else
break;
}
}
RecordReplaceNode(parser, node->GetSrcStart(), node->GetSrcLength());
}
void BfResolvePassData::HandleMethodReference(BfAstNode* node, BfTypeDef* typeDef, BfMethodDef* methodDef)
{
if ((mGetSymbolReferenceKind == BfGetSymbolReferenceKind_Method) && (mSymbolReferenceTypeDef == typeDef->GetDefinition()) &&
if ((mGetSymbolReferenceKind == BfGetSymbolReferenceKind_Method) && (mSymbolReferenceTypeDef == typeDef->GetDefinition()) &&
(mSymbolReferenceMethodIdx == methodDef->mIdx))
RecordReplaceNode(node);
}
void BfResolvePassData::HandleFieldReference(BfAstNode* node, BfTypeDef* typeDef, BfFieldDef* fieldDef)
{
if ((mGetSymbolReferenceKind == BfGetSymbolReferenceKind_Field) && (mSymbolReferenceTypeDef == typeDef->GetDefinition()) &&
if ((mGetSymbolReferenceKind == BfGetSymbolReferenceKind_Field) && (mSymbolReferenceTypeDef == typeDef->GetDefinition()) &&
(mSymbolReferenceFieldIdx == fieldDef->mIdx))
RecordReplaceNode(node);
}
void BfResolvePassData::HandlePropertyReference(BfAstNode* node, BfTypeDef* typeDef, BfPropertyDef* propDef)
{
if ((mGetSymbolReferenceKind == BfGetSymbolReferenceKind_Property) && (mSymbolReferenceTypeDef == typeDef->GetDefinition()) &&
if ((mGetSymbolReferenceKind == BfGetSymbolReferenceKind_Property) && (mSymbolReferenceTypeDef == typeDef->GetDefinition()) &&
(mSymbolReferencePropertyIdx == propDef->mIdx))
RecordReplaceNode(node);
}
void BfResolvePassData::HandleLocalReference(BfIdentifierNode* identifier, BfTypeDef* typeDef, BfMethodDef* methodDef, int localVarIdx)
{
if ((mGetSymbolReferenceKind == BfGetSymbolReferenceKind_Local) && (mSymbolReferenceTypeDef == typeDef->GetDefinition()) &&
if ((mGetSymbolReferenceKind == BfGetSymbolReferenceKind_Local) && (mSymbolReferenceTypeDef == typeDef->GetDefinition()) &&
(mSymbolReferenceMethodIdx == methodDef->mIdx) && (localVarIdx == mSymbolReferenceLocalIdx))
RecordReplaceNode(identifier);
}
@ -106,14 +106,14 @@ void BfResolvePassData::HandleTypeGenericParam(BfAstNode* node, BfTypeDef* typeD
void BfResolvePassData::HandleMethodGenericParam(BfAstNode* node, BfTypeDef* typeDef, BfMethodDef* methodDef, int genericParamIdx)
{
if ((mGetSymbolReferenceKind == BfGetSymbolReferenceKind_MethodGenericParam) && (mSymbolReferenceTypeDef == typeDef->GetDefinition()) &&
if ((mGetSymbolReferenceKind == BfGetSymbolReferenceKind_MethodGenericParam) && (mSymbolReferenceTypeDef == typeDef->GetDefinition()) &&
(mSymbolReferenceMethodIdx == methodDef->mIdx) && (genericParamIdx == mSymbolMethodGenericParamIdx))
RecordReplaceNode(node);
}
void BfResolvePassData::HandleLocalReference(BfIdentifierNode* identifier, BfIdentifierNode* origNameNode, BfTypeDef* typeDef, BfMethodDef* methodDef, int localVarIdx)
{
if ((mGetSymbolReferenceKind == BfGetSymbolReferenceKind_Local) && (mSymbolReferenceTypeDef == typeDef->GetDefinition()) &&
if ((mGetSymbolReferenceKind == BfGetSymbolReferenceKind_Local) && (mSymbolReferenceTypeDef == typeDef->GetDefinition()) &&
(mSymbolReferenceMethodIdx == methodDef->mIdx) && (localVarIdx == mSymbolReferenceLocalIdx))
{
if (origNameNode == NULL)
@ -122,7 +122,7 @@ void BfResolvePassData::HandleLocalReference(BfIdentifierNode* identifier, BfIde
int origLen = origNameNode->GetSrcLength();
int refLen = identifier->GetSrcLength();
// The lengths can be different if we have one or more @'s prepended
// The lengths can be different if we have one or more @'s prepended
RecordReplaceNode(identifier->GetSourceData()->ToParserData(), identifier->GetSrcStart() + (refLen - origLen), origLen);
}
}
@ -215,4 +215,4 @@ BfSourceClassifier* BfResolvePassData::GetSourceClassifier(BfParser* parser)
if (parser == NULL)
return NULL;
return parser->mSourceClassifier;
}
}

View file

@ -14,7 +14,7 @@ enum BfResolveType
BfResolveType_Autocomplete,
BfResolveType_Autocomplete_HighPri,
BfResolveType_GoToDefinition,
BfResolveType_GetSymbolInfo,
BfResolveType_GetSymbolInfo,
BfResolveType_RenameSymbol,
BfResolveType_ShowFileSymbolReferences,
BfResolveType_GetNavigationData,
@ -68,14 +68,14 @@ public:
BfAutoComplete* mAutoComplete;
Array<BfTypeDef*> mAutoCompleteTempTypes; // Contains multiple values when we have nested types
Dictionary<BfTypeDef*, BfStaticSearch> mStaticSearchMap;
Dictionary<BfTypeDef*, BfInternalAccessSet> mInternalAccessMap;
Dictionary<BfTypeDef*, BfInternalAccessSet> mInternalAccessMap;
Array<BfAstNode*> mExteriorAutocompleteCheckNodes;
BfGetSymbolReferenceKind mGetSymbolReferenceKind;
BfGetSymbolReferenceKind mGetSymbolReferenceKind;
String mQueuedReplaceTypeDef;
BfTypeDef* mSymbolReferenceTypeDef;
String mQueuedSymbolReferenceNamespace;
BfAtomComposite mSymbolReferenceNamespace;
BfAtomComposite mSymbolReferenceNamespace;
int mSymbolReferenceLocalIdx;
int mSymbolReferenceFieldIdx;
int mSymbolReferenceMethodIdx;
@ -85,7 +85,7 @@ public:
bool mIsClassifying;
bool mHasCursorIdx;
bool mHadEmits;
typedef Dictionary<BfParserData*, String> FoundSymbolReferencesParserDataMap;
FoundSymbolReferencesParserDataMap mFoundSymbolReferencesParserData;
//std::vector<BfIdentifierNode*> mSymbolReferenceIdentifiers;
@ -94,7 +94,7 @@ public:
public:
void RecordReplaceNode(BfParserData* parser, int srcStart, int srcLen);
void RecordReplaceNode(BfAstNode* node);
void RecordReplaceNode(BfAstNode* node);
BfAstNode* FindBaseNode(BfAstNode* node);
public:
@ -108,7 +108,7 @@ public:
void HandleMethodReference(BfAstNode* node, BfTypeDef* typeDef, BfMethodDef* methodDef);
void HandleFieldReference(BfAstNode* node, BfTypeDef* typeDef, BfFieldDef* fieldDef);
void HandlePropertyReference(BfAstNode* node, BfTypeDef* typeDef, BfPropertyDef* propDef);
void HandleTypeReference(BfAstNode* node, BfTypeDef* typeDef);
void HandleTypeReference(BfAstNode* node, BfTypeDef* typeDef);
void HandleNamespaceReference(BfAstNode* node, const BfAtomComposite& namespaceName);
BfSourceClassifier* GetSourceClassifier(BfAstNode* astNode);

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -16,7 +16,7 @@ BfSource::BfSource(BfSystem* bfSystem)
if (bfSystem != NULL)
mAstAllocManager = &gBfParserCache->mAstAllocManager;
mSrc = NULL;
mSrcLength = 0;
mSrcAllocSize = -1;
@ -36,7 +36,7 @@ BfSource::BfSource(BfSystem* bfSystem)
BfSource::~BfSource()
{
int sourceCount = gSourceCount--;
int sourceCount = gSourceCount--;
delete mSourceData;
@ -65,7 +65,7 @@ BfErrorNode* BfSource::CreateErrorNode(BfAstNode* astNode)
}
void BfSource::AddErrorNode(BfAstNode* astNode)
{
{
mPendingErrorNodes.push_back(CreateErrorNode(astNode));
}
@ -85,10 +85,10 @@ int BfSource::AllocChars(int charCount)
mSrcAllocSize = newAllocSize;
BF_ASSERT(mSourceData->ToParser() != NULL);
mSourceData->mSrc = mSrc;
mSourceData->mSrc = mSrc;
HadSrcRealloc();
}
}
int retVal = mSrcLength;
mSrcLength += charCount;
@ -130,7 +130,7 @@ void BfSource::FinishSideNodes()
}
void BfSource::Close()
{
{
// if (mAlloc->mSource == NULL)
// {
// BF_ASSERT(mErrorRootNode == NULL);
@ -149,4 +149,4 @@ void BfSource::Close()
}
mIsClosed = true;
}
}

View file

@ -21,7 +21,7 @@ public:
ExternalNodesState_Failed
};
public:
public:
const char* mSrc;
int mSrcLength;
BfAstAllocManager* mAstAllocManager;
@ -30,7 +30,7 @@ public:
BfRootNode* mSidechannelRootNode; // Holds comments and preprocessor nodes
BfRootNode* mRootNode;
BfRootNode* mErrorRootNode;
BfSizedArray<BfExteriorNode> mExteriorNodes;
int mExteriorNodesCheckIdx; // 0 = unchecked, -1 = failed, >0 means success and equals the BfSystem.mTypesIdx
@ -76,7 +76,7 @@ public:
BfAstAllocator* mAlloc;
const char* mSrc;
int mSrcLength;
int mSrcAllocSize;
int mSrcAllocSize;
bool mParsingFailed;
bool mIsClosed;
uint8* mAstScratch;
@ -86,28 +86,28 @@ public:
BfRootNode* mSidechannelRootNode; // Holds comments and preprocessor nodes
BfRootNode* mRootNode;
BfRootNode* mErrorRootNode;
BfParser* mNextRevision;
BfParser* mPrevRevision;
SizedArray<BfAstNode*, 8> mPendingSideNodes;
SizedArray<BfAstNode*, 8> mPendingErrorNodes;
public:
public:
bool WantsStats();
public:
BfSource(BfSystem* bfSystem);
virtual ~BfSource();
virtual BfParser* ToParser() { return NULL; }
virtual BfParser* ToParser() { return NULL; }
virtual void HadSrcRealloc() {}
BfErrorNode* CreateErrorNode(BfAstNode* astNode);
void AddErrorNode(BfAstNode* astNode);
int AllocChars(int charCount);
void AddErrorNode(BfAstNode* astNode);
int AllocChars(int charCount);
void FinishSideNodes();
virtual void Close(); // Writing done, return unused pages but retain used pages
virtual void Close(); // Writing done, return unused pages but retain used pages
};
NS_BF_END;

View file

@ -8,7 +8,7 @@ BfSourceClassifier::BfSourceClassifier(BfParser* bfParser, CharData* charData)
{
mParser = bfParser;
mCharData = charData;
mSkipMethodInternals = false;
mSkipMethodInternals = false;
mSkipTypeDeclarations = false;
mSkipAttributes = false;
mIsSideChannel = false;
@ -23,7 +23,7 @@ BfSourceClassifier::BfSourceClassifier(BfParser* bfParser, CharData* charData)
void BfSourceClassifier::ModifyFlags(BfAstNode* node, uint8 andFlags, uint8 orFlags)
{
if (node != NULL)
{
{
ModifyFlags(node->GetSrcStart(), node->GetSrcEnd(), andFlags, orFlags);
}
}
@ -35,8 +35,8 @@ void BfSourceClassifier::ModifyFlags(int startPos, int endPos, uint8 andFlags, u
endPos = std::min(endPos, mParser->mOrigSrcLength);
for (int i = startPos; i < endPos; i++)
{
mCharData[i].mDisplayPassId = mClassifierPassId;
{
mCharData[i].mDisplayPassId = mClassifierPassId;
mCharData[i].mDisplayFlags = (mCharData[i].mDisplayFlags & andFlags) | orFlags;
}
}
@ -62,13 +62,13 @@ void BfSourceClassifier::SetElementType(BfAstNode * node, BfTypeCode typeCode)
}
void BfSourceClassifier::SetHighestElementType(int startPos, int endPos, BfSourceElementType elementType)
{
{
if (!mEnabled)
return;
endPos = BF_MIN(endPos, mParser->mOrigSrcLength);
for (int i = startPos; i < endPos; i++)
{
{
auto& charData = mCharData[i];
charData.mDisplayPassId = mClassifierPassId;
charData.mDisplayTypeId = BF_MAX(charData.mDisplayTypeId, (uint8)elementType);
@ -100,15 +100,15 @@ void BfSourceClassifier::VisitMembers(BfBlock* node)
{
mPrevNode = NULL;
for (auto& childNodeRef : *node)
{
{
BfAstNode* child = childNodeRef;
child->Accept(this);
mPrevNode = child;
mPrevNode = child;
}
}
bool BfSourceClassifier::IsInterestedInMember(BfAstNode* node, bool forceSkip)
{
{
if ((mSkipMethodInternals || forceSkip) && (mParser->mCursorIdx != -1) &&
(!node->Contains(mParser->mCursorIdx, 1, 0)))
return false;
@ -121,16 +121,16 @@ void BfSourceClassifier::HandleLeafNode(BfAstNode* node)
return;
int nodeStart = node->GetSrcStart();
int srcStart = nodeStart;
int srcStart = nodeStart;
int triviaStart = node->GetTriviaStart();
if (triviaStart != -1)
{
srcStart = triviaStart;
if ((mIsSideChannel) && (mPrevNode != NULL))
srcStart = std::max(mPrevNode->GetSrcEnd(), srcStart);
}
if (nodeStart != srcStart)
SetElementType(srcStart, nodeStart, BfSourceElementType_Normal);
//SetElementType(srcStart, node->GetSrcEnd(), BfSourceElementType_Normal);
@ -140,7 +140,6 @@ void BfSourceClassifier::HandleLeafNode(BfAstNode* node)
void BfSourceClassifier::Visit(BfAstNode* node)
{
}
void BfSourceClassifier::Visit(BfErrorNode* errorNode)
@ -153,7 +152,7 @@ void BfSourceClassifier::Visit(BfFieldDeclaration* fieldDecl)
{
if (!IsInterestedInMember(fieldDecl))
return;
BfElementVisitor::Visit(fieldDecl);
VisitChild(fieldDecl->mConstSpecifier);
@ -188,12 +187,12 @@ void BfSourceClassifier::Visit(BfPreprocessorNode* preprocessorNode)
if (!mPreserveFlags)
ModifyFlags(preprocessorNode, ~BfSourceElementFlag_CompilerFlags_Mask, 0);
SetElementType(preprocessorNode, BfSourceElementType_Normal);
Visit(preprocessorNode->ToBase());
Visit(preprocessorNode->ToBase());
}
void BfSourceClassifier::Visit(BfCommentNode* commentNode)
{
{
HandleLeafNode(commentNode);
Visit(commentNode->ToBase());
@ -236,7 +235,7 @@ void BfSourceClassifier::Visit(BfAttributeDirective* attributeDirective)
}
}
BfElementVisitor::Visit(attributeDirective);
BfElementVisitor::Visit(attributeDirective);
VisitChild(attributeDirective->mAttrCloseToken);
@ -262,7 +261,7 @@ void BfSourceClassifier::Visit(BfAttributeDirective* attributeDirective)
for (auto& arg : attributeDirective->mArguments)
VisitChild(arg);
for (auto& comma : attributeDirective->mCommas)
VisitChild(comma);
VisitChild(comma);
VisitChild(attributeDirective->mNextAttribute);
}
@ -280,7 +279,7 @@ void BfSourceClassifier::Visit(BfIdentifierNode* identifier)
}
void BfSourceClassifier::Visit(BfQualifiedNameNode* qualifiedName)
{
{
Visit((BfAstNode*)qualifiedName);
VisitChild(qualifiedName->mLeft);
@ -406,11 +405,11 @@ void BfSourceClassifier::Visit(BfLiteralExpression* literalExpr)
void BfSourceClassifier::Visit(BfStringInterpolationExpression* stringInterpolationExpression)
{
HandleLeafNode(stringInterpolationExpression);
Visit(stringInterpolationExpression->ToBase());
SetElementType(stringInterpolationExpression, BfSourceElementType_Literal);
VisitChild(stringInterpolationExpression->mAllocNode);
VisitChild(stringInterpolationExpression->mAllocNode);
for (auto& expr : stringInterpolationExpression->mExpressions)
{
SetElementType(expr, BfSourceElementType_Normal);
@ -423,7 +422,7 @@ void BfSourceClassifier::Visit(BfTokenNode* tokenNode)
HandleLeafNode(tokenNode);
Visit(tokenNode->ToBase());
if (BfTokenIsKeyword(tokenNode->GetToken()))
SetElementType(tokenNode, BfSourceElementType_Keyword);
else
@ -436,15 +435,15 @@ void BfSourceClassifier::Visit(BfInvocationExpression* invocationExpr)
Visit(invocationExpr->ToBase());
//BP_ZONE("BfSourceClassifier BfInvocationExpression");
BfAstNode* target = invocationExpr->mTarget;
if (target == NULL)
return;
VisitChild(invocationExpr->mOpenParen);
VisitChild(invocationExpr->mCloseParen);
VisitChild(invocationExpr->mGenericArgs);
if (auto scopedTarget = BfNodeDynCast<BfScopedInvocationTarget>(target))
{
VisitChild(target);
@ -458,27 +457,27 @@ void BfSourceClassifier::Visit(BfInvocationExpression* invocationExpr)
VisitChild(qualifiedName->mLeft);
VisitChild(qualifiedName->mDot);
VisitChild(qualifiedName->mRight);
identifier = qualifiedName->mRight;
identifier = qualifiedName->mRight;
}
else if ((identifier = BfNodeDynCast<BfIdentifierNode>(target)))
{
VisitChild(target);
// Leave as BfAttributedIdentifierNode if that's the case
identifier = target;
identifier = target;
}
else if (auto qualifiedName = BfNodeDynCast<BfQualifiedNameNode>(target))
{
VisitChild(qualifiedName->mLeft);
VisitChild(qualifiedName->mDot);
VisitChild(qualifiedName->mRight);
identifier = qualifiedName->mRight;
identifier = qualifiedName->mRight;
}
else if (auto memberRefExpr = BfNodeDynCast<BfMemberReferenceExpression>(target))
{
VisitChild(memberRefExpr->mTarget);
VisitChild(memberRefExpr->mDotToken);
VisitChild(memberRefExpr->mMemberName);
identifier = memberRefExpr->mMemberName;
identifier = memberRefExpr->mMemberName;
}
else
{
@ -490,9 +489,9 @@ void BfSourceClassifier::Visit(BfInvocationExpression* invocationExpr)
if (auto attrIdentifier = BfNodeDynCast<BfAttributedIdentifierNode>(identifier))
{
VisitChild(attrIdentifier->mAttributes);
identifier = attrIdentifier->mIdentifier;
identifier = attrIdentifier->mIdentifier;
}
if (identifier != NULL)
SetElementType(identifier, BfSourceElementType_Method);
}
@ -551,7 +550,7 @@ void BfSourceClassifier::Visit(BfDestructorDeclaration* dtorDeclaration)
}
void BfSourceClassifier::Visit(BfMethodDeclaration* methodDeclaration)
{
{
if (!IsInterestedInMember(methodDeclaration))
return;
@ -559,8 +558,8 @@ void BfSourceClassifier::Visit(BfMethodDeclaration* methodDeclaration)
SetAndRestoreValue<BfAstNode*> prevMember(mCurMember, methodDeclaration);
BfElementVisitor::Visit(methodDeclaration);
BfElementVisitor::Visit(methodDeclaration);
SetElementType(methodDeclaration->mNameNode, BfSourceElementType_Method);
if (methodDeclaration->mGenericParams != NULL)
@ -582,7 +581,7 @@ void BfSourceClassifier::Visit(BfMethodDeclaration* methodDeclaration)
if (typeRef != NULL)
{
if (auto namedTypeRef = BfNodeDynCast<BfNamedTypeReference>(typeRef))
SetElementType(typeRef, BfSourceElementType_GenericParam);
SetElementType(typeRef, BfSourceElementType_GenericParam);
else
VisitChild(typeRef);
}
@ -651,7 +650,7 @@ void BfSourceClassifier::Handle(BfTypeDeclaration* typeDeclaration)
llvm::SmallVector<BfTypeReference*, 2> mBaseClasses;
llvm::SmallVector<BfAstNode*, 2> mBaseClassCommas;
if (typeDeclaration->mGenericParams != NULL)
{
for (auto& genericParam : typeDeclaration->mGenericParams->mGenericParams)
@ -712,7 +711,7 @@ void BfSourceClassifier::Visit(BfTypeAliasDeclaration* typeDeclaration)
if (typeDeclaration->mIgnoreDeclaration)
return;
BfElementVisitor::Visit(typeDeclaration);
BfElementVisitor::Visit(typeDeclaration);
}
void BfSourceClassifier::Visit(BfUsingDirective* usingDirective)
@ -735,7 +734,7 @@ void BfSourceClassifier::Visit(BfUsingDirective* usingDirective)
void BfSourceClassifier::Visit(BfUsingModDirective* usingDirective)
{
BfElementVisitor::Visit(usingDirective);
BfElementVisitor::Visit(usingDirective);
}
void BfSourceClassifier::Visit(BfNamespaceDeclaration* namespaceDeclaration)
@ -760,7 +759,7 @@ bool BfSourceClassifier::WantsSkipParentMethod(BfAstNode* node)
{
if (!mSkipMethodInternals)
return false;
#ifdef BF_AST_HAS_PARENT_MEMBER
if (node->mParent->IsA<BfMethodDeclaration>())
{
@ -798,7 +797,7 @@ void BfSourceClassifier::Visit(BfGenericConstraintsDeclaration* genericConstrain
}
void BfSourceClassifier::Visit(BfBlock* block)
{
{
if (WantsSkipParentMethod(block))
return;
if (block->mOpenBrace != NULL)
@ -813,7 +812,7 @@ void BfSourceClassifier::Visit(BfRootNode* rootNode)
// Clear off the flags at the end
ModifyFlags(mParser->mRootNode->GetSrcEnd(), mParser->mOrigSrcLength, 0, 0);
VisitMembers(rootNode);
VisitMembers(rootNode);
}
void BfSourceClassifier::Visit(BfInlineAsmStatement* asmStmt)
@ -822,7 +821,7 @@ void BfSourceClassifier::Visit(BfInlineAsmStatement* asmStmt)
Visit(asmStmt->mOpenBrace);
if (asmStmt->mCloseBrace != NULL)
Visit(asmStmt->mCloseBrace);
//VisitMembers(asmStmt);
}

View file

@ -12,7 +12,7 @@ enum BfSourceElementType
BfSourceElementType_Normal,
BfSourceElementType_Keyword,
BfSourceElementType_Literal,
BfSourceElementType_Identifier,
BfSourceElementType_Identifier,
BfSourceElementType_Comment,
BfSourceElementType_Method,
BfSourceElementType_Type,
@ -48,7 +48,7 @@ class BfSourceClassifier : public BfElementVisitor
public:
struct CharData
{
char mChar;
char mChar;
uint8 mDisplayPassId;
uint8 mDisplayTypeId;
uint8 mDisplayFlags;
@ -58,8 +58,8 @@ public:
};
public:
BfParser* mParser;
CharData* mCharData;
BfParser* mParser;
CharData* mCharData;
bool mEnabled;
bool mSkipMethodInternals;
bool mSkipTypeDeclarations;
@ -96,7 +96,7 @@ public:
virtual void Visit(BfGenericConstraintsDeclaration* genericConstraints) override;
virtual void Visit(BfAstNode* node) override;
virtual void Visit(BfErrorNode* errorNode) override;
virtual void Visit(BfErrorNode* errorNode) override;
virtual void Visit(BfFieldDeclaration* fieldDecl) override;
virtual void Visit(BfFieldDtorDeclaration* fieldDtorDecl) override;
virtual void Visit(BfPreprocesorIgnoredSectionNode* preprocesorIgnoredSection) override;
@ -104,10 +104,10 @@ public:
virtual void Visit(BfCommentNode* commentNode) override;
virtual void Visit(BfAttributeDirective* attributeDirective) override;
virtual void Visit(BfIdentifierNode* identifier) override;
virtual void Visit(BfQualifiedNameNode* identifier) override;
virtual void Visit(BfQualifiedNameNode* identifier) override;
virtual void Visit(BfThisExpression* thisExpr) override;
virtual void Visit(BfBaseExpression* baseExpr) override;
virtual void Visit(BfMemberReferenceExpression* memberRefExpr) override;
virtual void Visit(BfMemberReferenceExpression* memberRefExpr) override;
virtual void Visit(BfQualifiedTypeReference* qualifiedType) override;
virtual void Visit(BfRefTypeRef* typeRef) override;
virtual void Visit(BfArrayTypeRef* arrayType) override;
@ -118,11 +118,11 @@ public:
virtual void Visit(BfLiteralExpression* literalExpr) override;
virtual void Visit(BfStringInterpolationExpression* stringInterpolationExpression) override;
virtual void Visit(BfTokenNode* tokenNode) override;
virtual void Visit(BfInvocationExpression* invocationExpr) override;
virtual void Visit(BfInvocationExpression* invocationExpr) override;
virtual void Visit(BfIndexerExpression* indexerExpr) override;
virtual void Visit(BfConstructorDeclaration* ctorDeclaration) override;
virtual void Visit(BfDestructorDeclaration* dtorDeclaration) override;
virtual void Visit(BfMethodDeclaration* methodDeclaration) override;
virtual void Visit(BfConstructorDeclaration* ctorDeclaration) override;
virtual void Visit(BfDestructorDeclaration* dtorDeclaration) override;
virtual void Visit(BfMethodDeclaration* methodDeclaration) override;
virtual void Visit(BfPropertyMethodDeclaration* propertyMethodDeclaration) override;
virtual void Visit(BfPropertyDeclaration* propertyDeclaration) override;
virtual void Visit(BfTypeDeclaration* typeDeclaration) override;

View file

@ -13,5 +13,5 @@ BfSourcePositionFinder::BfSourcePositionFinder(BfParser* bfParser, int findPosit
void BfSourcePositionFinder::Visit(BfAstNode* node)
{
if ((mFindPosition >= node->GetSrcStart()) && (mFindPosition <= node->GetSrcEnd()))
mClosestElement = node;
}
mClosestElement = node;
}

View file

@ -16,7 +16,7 @@ public:
BfSourcePositionFinder(BfParser* bfParser, int findPosition);
using BfStructuralVisitor::Visit;
virtual void Visit(BfAstNode* node) override;
virtual void Visit(BfAstNode* node) override;
};
NS_BF_END

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -56,7 +56,7 @@ public:
uint32 mAtomUpdateIdx;
bool mIsSystemType;
Dictionary<BfAtom*, int> mPrevNamesMap;
public:
~BfAtom();
const StringView& ToString()
@ -68,7 +68,7 @@ public:
str += mString;
}
void Ref();
void Ref();
};
class BfAtomComposite
@ -80,15 +80,15 @@ public:
bool mOwns;
public:
BfAtomComposite();
BfAtomComposite();
BfAtomComposite(BfAtomComposite&& rhs);
BfAtomComposite(const BfAtomComposite& rhs);
BfAtomComposite(BfAtom* atom);
BfAtomComposite(BfAtom* atom);
BfAtomComposite(const BfAtomComposite& left, const BfAtomComposite& right);
BfAtomComposite(const BfAtomComposite& left, BfAtom* right);
~BfAtomComposite();
void Set(const BfAtomComposite& left, const BfAtomComposite& right);
void Set(const BfAtomComposite& left, const BfAtomComposite& right);
void Set(BfAtom** atomsA, int countA, BfAtom** atomsB, int countB);
BfAtomComposite& operator=(const BfAtomComposite& rhs);
bool operator==(const BfAtomComposite& other) const;
@ -102,7 +102,7 @@ public:
bool EndsWith(const BfAtomComposite& other) const;
BfAtomComposite GetSub(int start, int len) const;
void Reference(const BfAtomComposite& other);
uint32 GetAtomUpdateIdx();
};
@ -138,17 +138,17 @@ class BfSizedAtomComposite : public BfAtomComposite
public:
BfAtom* mInitialAlloc[8];
BfSizedAtomComposite();
~BfSizedAtomComposite();
BfSizedAtomComposite();
~BfSizedAtomComposite();
};
struct BfAtomCompositeHash
{
size_t operator()(const BfAtomComposite& composite) const
{
int curHash = 0;
for (int i = 0; i < (int)composite.mSize; i++)
curHash = ((curHash ^ (int)(intptr)composite.mParts[i]->mHash) << 5) - curHash;
int curHash = 0;
for (int i = 0; i < (int)composite.mSize; i++)
curHash = ((curHash ^ (int)(intptr)composite.mParts[i]->mHash) << 5) - curHash;
return curHash;
}
};
@ -179,7 +179,7 @@ enum BfCompilerOptionFlags
BfCompilerOptionFlag_EmitLineInfo = 2,
BfCompilerOptionFlag_WriteIR = 4,
BfCompilerOptionFlag_GenerateOBJ = 8,
BfCompilerOptionFlag_GenerateBitcode = 0x10,
BfCompilerOptionFlag_GenerateBitcode = 0x10,
BfCompilerOptionFlag_ClearLocalVars = 0x20,
BfCompilerOptionFlag_RuntimeChecks = 0x40,
BfCompilerOptionFlag_EmitDynamicCastCheck = 0x80,
@ -190,7 +190,7 @@ enum BfCompilerOptionFlags
BfCompilerOptionFlag_EnableSideStack = 0x1000,
BfCompilerOptionFlag_EnableHotSwapping = 0x2000,
BfCompilerOptionFlag_IncrementalBuild = 0x4000,
BfCompilerOptionFlag_DebugAlloc = 0x8000,
BfCompilerOptionFlag_DebugAlloc = 0x8000,
BfCompilerOptionFlag_OmitDebugHelpers = 0x10000,
BfCompilerOptionFlag_NoFramePointerElim = 0x20000,
BfCompilerOptionFlag_ArithmeticChecks = 0x40000,
@ -234,7 +234,7 @@ enum BfMethodFlags
BfMethodFlags_FastCall = 0x2000,
BfMethodFlags_ThisCall = 0x3000,
BfMethodFlags_Mutating = 0x4000,
BfMethodFlags_Constructor = 0x8000
BfMethodFlags_Constructor = 0x8000
};
enum BfObjectFlags : uint8
@ -344,7 +344,7 @@ enum BfLTOType
};
enum BfCFLAAType
{
{
BfCFLAAType_None,
BfCFLAAType_Steensgaard,
BfCFLAAType_Andersen,
@ -354,11 +354,11 @@ enum BfCFLAAType
enum BfRelocType
{
BfRelocType_NotSet,
BfRelocType_Static,
BfRelocType_PIC,
BfRelocType_Static,
BfRelocType_PIC,
BfRelocType_DynamicNoPIC,
BfRelocType_ROPI,
BfRelocType_RWPI,
BfRelocType_RWPI,
BfRelocType_ROPI_RWPI
};
@ -366,32 +366,32 @@ enum BfPICLevel
{
BfPICLevel_NotSet,
BfPICLevel_Not,
BfPICLevel_Small,
BfPICLevel_Small,
BfPICLevel_Big
};
struct BfCodeGenOptions
{
{
bool mIsHotCompile;
bool mWriteObj;
bool mWriteBitcode;
BfAsmKind mAsmKind;
bool mWriteToLib;
bool mWriteLLVMIR;
bool mWriteLLVMIR;
int16 mVirtualMethodOfs;
int16 mDynSlotOfs;
BfRelocType mRelocType;
BfPICLevel mPICLevel;
BfSIMDSetting mSIMDSetting;
BfSIMDSetting mSIMDSetting;
BfOptLevel mOptLevel;
BfLTOType mLTOType;
int mSizeLevel;
BfCFLAAType mUseCFLAA;
bool mUseNewSROA;
bool mDisableTailCalls;
bool mDisableUnitAtATime;
bool mDisableUnrollLoops;
@ -410,7 +410,7 @@ struct BfCodeGenOptions
bool mUseGVNAfterVectorization;
bool mEnableLoopInterchange;
bool mEnableLoopLoadElim;
bool mExtraVectorizerPasses;
bool mExtraVectorizerPasses;
bool mEnableEarlyCSEMemSSA;
bool mEnableGVNHoist;
bool mEnableGVNSink;
@ -427,8 +427,8 @@ struct BfCodeGenOptions
Val128 mHash;
BfCodeGenOptions()
{
mIsHotCompile = false;
{
mIsHotCompile = false;
mWriteObj = true;
mWriteBitcode = false;
mAsmKind = BfAsmKind_None;
@ -436,7 +436,7 @@ struct BfCodeGenOptions
mWriteLLVMIR = false;
mVirtualMethodOfs = 0;
mDynSlotOfs = 0;
mRelocType = BfRelocType_NotSet;
mPICLevel = BfPICLevel_NotSet;
mSIMDSetting = BfSIMDSetting_None;
@ -445,7 +445,7 @@ struct BfCodeGenOptions
mSizeLevel = 0;
mUseCFLAA = BfCFLAAType_None;
mUseNewSROA = false;
mDisableTailCalls = false;
mDisableUnitAtATime = false;
mDisableUnrollLoops = false;
@ -480,7 +480,7 @@ struct BfCodeGenOptions
}
void GenerateHash()
{
{
HashContext hashCtx;
hashCtx.Mixin(mWriteObj);
@ -524,7 +524,6 @@ struct BfCodeGenOptions
}
};
enum BfParamKind : uint8
{
BfParamKind_Normal,
@ -547,7 +546,7 @@ class BfParameterDef
{
public:
String mName;
BfTypeReference* mTypeRef;
BfTypeReference* mTypeRef;
BfParameterDeclaration* mParamDeclaration;
int mMethodGenericParamIdx;
BfParamKind mParamKind;
@ -559,7 +558,7 @@ public:
mTypeRef = NULL;
mMethodGenericParamIdx = -1;
mParamKind = BfParamKind_Normal;
mParamDeclaration = NULL;
mParamDeclaration = NULL;
mNamePrefixCount = 0;
}
void SetName(BfAstNode* nameNode);
@ -579,7 +578,7 @@ public:
bool mIsStatic;
BfShow mShow;
bool mIsReadOnly;
bool mHasMultiDefs;
bool mHasMultiDefs;
public:
BfMemberDef()
@ -603,25 +602,25 @@ public:
class BfFieldDef : public BfMemberDef
{
public:
int mIdx;
bool mIsConst; // Note: Consts are also all considered Static
int mIdx;
bool mIsConst; // Note: Consts are also all considered Static
BfTypeReference* mTypeRef;
BfProtection mUsingProtection;
bool mIsInline;
bool mIsVolatile;
bool mIsExtern;
bool mIsExtern;
bool mIsAppend;
bool mIsProperty;
bool mIsProperty;
BfAstNode* mFieldDeclaration;
// It may seem that fields and properties don't need a 'mNextWithSameName', but with extensions it's possible
// to have two libraries which each add a field to a type with the same name
// to have two libraries which each add a field to a type with the same name
BfFieldDef* mNextWithSameName;
public:
BfFieldDef()
{
mIdx = 0;
mIsConst = false;
mIsConst = false;
mTypeRef = NULL;
mUsingProtection = BfProtection_Hidden;
mIsInline = false;
@ -686,7 +685,7 @@ public:
return paramDecl->mInitializer;
return NULL;
}
BfAstNode* GetNameNode()
{
if (auto fieldDecl = GetFieldDeclaration())
@ -699,18 +698,18 @@ public:
class BfPropertyDef : public BfFieldDef
{
public:
Array<BfMethodDef*> mMethods;
public:
Array<BfMethodDef*> mMethods;
BfPropertyDef* mNextWithSameName;
public:
BfPropertyDef()
{
{
mNextWithSameName = NULL;
}
}
bool IsVirtual();
bool HasExplicitInterface();
bool HasExplicitInterface();
bool IsExpressionBodied();
BfAstNode* GetRefNode();
};
@ -722,7 +721,7 @@ enum BfGenericParamFlags : uint16
BfGenericParamFlag_Struct = 2,
BfGenericParamFlag_StructPtr = 4,
BfGenericParamFlag_Enum = 8,
BfGenericParamFlag_Interface = 0x10,
BfGenericParamFlag_Interface = 0x10,
BfGenericParamFlag_Concrete = 0x20,
BfGenericParamFlag_New = 0x40,
BfGenericParamFlag_Delete = 0x80,
@ -768,10 +767,10 @@ public:
class BfGenericParamDef : public BfConstraintDef
{
public:
String mName;
public:
String mName;
Array<BfIdentifierNode*> mNameNodes; // 0 is always the def name
bool operator==(const BfGenericParamDef& other) const
{
if (mName != other.mName)
@ -788,7 +787,7 @@ public:
class BfExternalConstraintDef : public BfConstraintDef
{
public:
BfTypeReference* mTypeRef;
BfTypeReference* mTypeRef;
};
// CTOR is split into two for Objects - Ctor clears and sets up VData, Ctor_Body executes ctor body code
@ -814,7 +813,7 @@ enum BfCallingConvention : uint8
BfCallingConvention_Unspecified,
BfCallingConvention_Cdecl,
BfCallingConvention_Stdcall,
BfCallingConvention_Fastcall,
BfCallingConvention_Fastcall,
};
#define BF_METHODNAME_MARKMEMBERS "GCMarkMembers"
@ -866,9 +865,9 @@ enum BfComptimeFlags : int8
class BfMethodDef : public BfMemberDef
{
public:
BfAstNode* mMethodDeclaration;
BfAstNode* mBody;
public:
BfAstNode* mMethodDeclaration;
BfAstNode* mBody;
BfTypeReference* mExplicitInterface;
BfTypeReference* mReturnTypeRef;
@ -893,7 +892,7 @@ public:
bool mWantsBody;
bool mCLink;
bool mHasAppend;
bool mAlwaysInline;
bool mAlwaysInline;
bool mIsNoReturn;
bool mIsMutating;
bool mIsNoSplat;
@ -901,14 +900,14 @@ public:
bool mIsSkipCall;
bool mHasComptime;
bool mIsOperator;
bool mIsExtern;
bool mIsExtern;
bool mIsNoDiscard;
bool mHasExplicitThis;
bool mAddedAfterEmit;
BfCommutableKind mCommutableKind;
BfCheckedKind mCheckedKind;
BfImportKind mImportKind;
BfCallingConvention mCallingConvention;
BfImportKind mImportKind;
BfCallingConvention mCallingConvention;
public:
BfMethodDef()
@ -923,7 +922,7 @@ public:
mIsStatic = false;
mIsNew = false;
mIsPartial = false;
mCLink = false;
mCLink = false;
mIsNoReturn = false;
mIsMutating = false;
mIsNoSplat = false;
@ -958,16 +957,16 @@ public:
bool HasNoThisSplat() { return mIsMutating || mIsNoSplat; }
void Reset();
void FreeMembers();
BfMethodDeclaration* GetMethodDeclaration();
BfMethodDeclaration* GetMethodDeclaration();
BfPropertyMethodDeclaration* GetPropertyMethodDeclaration();
BfPropertyDeclaration* GetPropertyDeclaration();
BfAstNode* GetRefNode();
BfTokenNode* GetMutNode();
BfTokenNode* GetMutNode();
bool HasBody();
bool IsEmptyPartial();
bool IsEmptyPartial();
bool IsDefaultCtor();
bool IsCtorOrInit();
String ToString();
String ToString();
int GetExplicitParamCount();
void BuildParamNameMap();
};
@ -975,7 +974,7 @@ public:
class BfOperatorDef : public BfMethodDef
{
public:
BfOperatorDeclaration* mOperatorDeclaration;
BfOperatorDeclaration* mOperatorDeclaration;
public:
BfOperatorDef()
@ -996,7 +995,7 @@ public:
struct BfTypeDefLookupContext
{
public:
int mBestPri;
int mBestPri;
BfTypeDef* mBestTypeDef;
BfTypeDef* mAmbiguousTypeDef;
@ -1005,8 +1004,8 @@ public:
{
mBestPri = (int)0x80000000;
mBestTypeDef = NULL;
mAmbiguousTypeDef = NULL;
}
mAmbiguousTypeDef = NULL;
}
bool HasValidMatch()
{
@ -1036,12 +1035,12 @@ struct BfMemberSetEntry
class BfTypeDefMemberSet : public HashSet<BfMemberSetEntry>
{
public:
public:
int mSourceSize;
public:
BfTypeDefMemberSet()
{
{
mSourceSize = 0;
}
@ -1052,7 +1051,7 @@ public:
}
};
// For partial classes, the first entry in the map will contain the combined data
// For partial classes, the first entry in the map will contain the combined data
class BfTypeDef
{
public:
@ -1073,16 +1072,16 @@ public:
public:
BfTypeDef* mNextRevision;
BfSystem* mSystem;
BfProject* mProject;
BfTypeDeclaration* mTypeDeclaration;
BfSource* mSource;
DefState mDefState;
BfSource* mSource;
DefState mDefState;
Val128 mSignatureHash; // Data, methods, etc
Val128 mFullHash;
Val128 mFullHash;
Val128 mInlineHash;
BfTypeDef* mEmitParent;
BfTypeDef* mOuterType;
BfAtomComposite mNamespace;
@ -1101,13 +1100,13 @@ public:
BfTypeDefMemberSet mFieldSet;
BfTypeDefMemberSet mPropertySet;
Array<BfOperatorDef*> mOperators;
Array<BfGenericParamDef*> mGenericParamDefs;
Array<BfGenericParamDef*> mGenericParamDefs;
Array<BfExternalConstraintDef> mExternalConstraints;
Array<BfTypeReference*> mBaseTypes;
Array<BfTypeDef*> mNestedTypes;
Array<BfTypeReference*> mBaseTypes;
Array<BfTypeDef*> mNestedTypes;
Array<BfDirectStrTypeReference*> mDirectAllocNodes;
Array<BfTypeDef*> mPartials; // Only valid for mIsCombinedPartial
Array<BfTypeDef*> mPartials; // Only valid for mIsCombinedPartial
int mHash;
int mPartialIdx;
int mNestDepth;
@ -1123,29 +1122,29 @@ public:
bool mIsDelegate;
bool mIsFunction;
bool mIsClosure;
bool mIsAbstract;
bool mIsStatic;
bool mIsAbstract;
bool mIsStatic;
bool mHasCEOnCompile;
bool mHasAppendCtor;
bool mHasCtorNoBody;
bool mHasExtensionMethods;
bool mHasOverrideMethods;
bool mHasOverrideMethods;
bool mHasUsingFields;
bool mIsOpaque;
bool mIsNextRevision;
bool mInDeleteQueue;
bool mInDeleteQueue;
bool mForceUseNextRevision;
public:
BfTypeDef()
{
{
Init();
}
~BfTypeDef();
void Init()
{
{
mName = NULL;
mNameEx = NULL;
mSystem = NULL;
@ -1158,11 +1157,11 @@ public:
mIsPartial = false;
mIsCombinedPartial = false;
mTypeDeclaration = NULL;
mSource = NULL;
mSource = NULL;
mDefState = DefState_New;
mHash = 0;
mHash = 0;
mPartialIdx = -1;
mIsAbstract = false;
mIsAbstract = false;
mIsDelegate = false;
mIsFunction = false;
mIsClosure = false;
@ -1176,29 +1175,29 @@ public:
mIsOpaque = false;
mPartialUsed = false;
mIsNextRevision = false;
mInDeleteQueue = false;
mInDeleteQueue = false;
mForceUseNextRevision = false;
mDupDetectedRevision = -1;
mNestDepth = 0;
mEmitParent = NULL;
mOuterType = NULL;
mTypeDeclaration = NULL;
mTypeDeclaration = NULL;
mNextRevision = NULL;
mProtection = BfProtection_Public;
mProtection = BfProtection_Public;
}
BfSource* GetLastSource();
bool IsGlobalsContainer();
bool IsGlobalsContainer();
void Reset();
void FreeMembers();
void PopulateMemberSets();
void ClearMemberSets();
void RemoveGenericParamDef(BfGenericParamDef* genericParamDef);
void RemoveGenericParamDef(BfGenericParamDef* genericParamDef);
int GetSelfGenericParamCount();
String ToString();
BfMethodDef* GetMethodByName(const StringImpl& name, int paramCount = -1);
BfFieldDef* GetFieldByName(const StringImpl& name);
bool HasAutoProperty(BfPropertyDeclaration* propertyDeclaration);
bool HasAutoProperty(BfPropertyDeclaration* propertyDeclaration);
bool ContainsPartial(BfTypeDef* partialTypeDef);
bool HasParsingFailed();
String GetAutoPropertyName(BfPropertyDeclaration* propertyDeclaration);
@ -1274,7 +1273,7 @@ public:
SkipEntry()
{
mIndex = -1;
mRevision = -1;
mRevision = -1;
}
SkipEntry(int index, int revision)
@ -1337,12 +1336,12 @@ public:
enum BfTargetType
{
BfTargetType_BeefConsoleApplication,
BfTargetType_BeefWindowsApplication,
BfTargetType_BeefLib,
BfTargetType_BeefWindowsApplication,
BfTargetType_BeefLib,
BfTargetType_CustomBuild,
BfTargetType_BeefTest,
BfTargetType_C_ConsoleApplication,
BfTargetType_C_WindowsApplication,
BfTargetType_C_WindowsApplication,
BfTargetType_BeefApplication_StaticLib,
BfTargetType_BeefApplication_DynamicLib,
BfTargetType_BeefLib_StaticLib,
@ -1372,14 +1371,14 @@ public:
DeleteStage_AwaitingRefs,
};
public:
public:
BfSystem* mSystem;
String mName;
String mSafeName;
String mDirectory;
Array<BfProject*> mDependencies;
BfTargetType mTargetType;
BfCodeGenOptions mCodeGenOptions;
BfCodeGenOptions mCodeGenOptions;
bool mDisabled;
bool mSingleModule;
bool mAlwaysIncludeAll;
@ -1387,11 +1386,11 @@ public:
int mIdx;
String mStartupObject;
Array<String> mPreprocessorMacros;
Array<String> mPreprocessorMacros;
Dictionary<BfAtomComposite, int> mNamespaces;
HashSet<BfModule*> mUsedModules;
HashSet<BfType*> mReferencedTypeData;
HashSet<BfType*> mReferencedTypeData;
Val128 mBuildConfigHash;
Val128 mVDataConfigHash;
@ -1403,7 +1402,7 @@ public:
~BfProject();
bool ContainsReference(BfProject* refProject);
bool ReferencesOrReferencedBy(BfProject* refProject);
bool ReferencesOrReferencedBy(BfProject* refProject);
bool IsTestProject();
};
@ -1415,7 +1414,7 @@ enum BfWarning
BfWarning_CS0162_UnreachableCode = 162,
BfWarning_CS0168_VariableDeclaredButNeverUsed = 168,
BfWarning_CS0472_ValueTypeNullCompare = 472,
BfWarning_CS1030_PragmaWarning = 1030,
BfWarning_CS1030_PragmaWarning = 1030,
BfWarning_BF4201_Only7Hex = 4201,
BfWarning_BF4202_TooManyHexForInt = 4202,
BfWarning_BF4203_UnnecessaryDynamicCast = 4203,
@ -1438,9 +1437,9 @@ class BfErrorBase
public:
bool mIsWarning;
bool mIsDeferred;
BfSourceData* mSource;
BfSourceData* mSource;
int mSrcStart;
int mSrcEnd;
int mSrcEnd;
BfErrorLocation* mLocation;
public:
@ -1448,7 +1447,7 @@ public:
{
mIsWarning = false;
mIsDeferred = false;
mSource = NULL;
mSource = NULL;
mSrcStart = -1;
mSrcEnd = -1;
mLocation = NULL;
@ -1466,11 +1465,11 @@ public:
class BfError : public BfErrorBase
{
public:
bool mIsAfter;
public:
bool mIsAfter;
bool mIsPersistent;
BfWhileSpecializingFlags mIsWhileSpecializing;
bool mIgnore;
bool mIgnore;
BfProject* mProject;
String mError;
int mWarningNumber;
@ -1479,10 +1478,10 @@ public:
public:
BfError()
{
mIsAfter = false;
mIsAfter = false;
mIsPersistent = false;
mIsWhileSpecializing = BfWhileSpecializingFlag_None;
mIgnore = false;
mIgnore = false;
mProject = NULL;
mWarningNumber = 0;
}
@ -1540,16 +1539,16 @@ public:
BfSystem* mSystem;
BfCompiler* mCompiler;
bool mTrimMessagesToCursor;
int mFailedIdx;
int mFailedIdx;
int mWarnIdx;
Dictionary<BfSourceData*, String> mSourceFileNameMap;
HashSet<BfErrorEntry> mErrorSet;
Array<BfError*> mErrors;
int mIgnoreCount;
int mWarningCount;
int mWarningCount;
int mDeferredErrorCount;
Deque<String> mOutStream;
Deque<String> mOutStream;
bool mLastWasDisplayed;
bool mLastWasAdded;
uint8 mClassifierPassId;
@ -1567,9 +1566,9 @@ public:
mLastWasDisplayed = false;
mLastWasAdded = false;
mClassifierPassId = 0;
mWarningCount = 0;
mWarningCount = 0;
mDeferredErrorCount = 0;
mIgnoreCount = 0;
mIgnoreCount = 0;
mHadSignatureChanges = false;
}
@ -1594,7 +1593,7 @@ public:
BfError* Warn(int warningNumber, const StringImpl& warning, BfAstNode* refNode, bool isDeferred = false);
BfError* DeferWarn(int warningNumber, const StringImpl& warning, BfAstNode* refNode);
BfError* WarnAfter(int warningNumber, const StringImpl& warning, BfAstNode* refNode);
BfError* WarnAfterAt(int warningNumber, const StringImpl& error, BfSourceData* bfSource, int srcIdx);
BfError* WarnAfterAt(int warningNumber, const StringImpl& error, BfSourceData* bfSource, int srcIdx);
BfMoreInfo* MoreInfoAt(const StringImpl& info, BfSourceData* bfSource, int srcIdx, int srcLen, BfFailFlags flags = BfFailFlag_None);
BfMoreInfo* MoreInfo(const StringImpl& info, bool forceQueue = false);
@ -1608,7 +1607,7 @@ public:
BfError* FailAfter(const StringImpl& error, BfAstNode* refNode);
BfError* DeferFail(const StringImpl& error, BfAstNode* refNode);
void SilentFail();
void TryFlushDeferredError();
void WriteErrorSummary();
};
@ -1635,7 +1634,6 @@ enum BfOptionFlags
BfOptionFlags_Reflect_MethodMask = BfOptionFlags_ReflectStaticMethods | BfOptionFlags_ReflectNonStaticMethods | BfOptionFlags_ReflectConstructors,
BfOptionFlags_Mask = 0x3FFF
};
enum BfFieldFlags
@ -1661,7 +1659,7 @@ enum BfReflectKind
BfReflectKind_DefaultConstructor = 8,
BfReflectKind_Constructors = 0x10,
BfReflectKind_StaticMethods = 0x20,
BfReflectKind_Methods = 0x40,
BfReflectKind_Methods = 0x40,
BfReflectKind_DynamicBoxing = 0x80,
BfReflectKind_User = 0x100,
BfReflectKind_All = 0x1FF,
@ -1682,15 +1680,15 @@ public:
public:
Array<String> mTypeFilters;
Array<String> mAttributeFilters;
Array<int> mMatchedIndices;
Array<int> mMatchedIndices;
int mSIMDSetting;
int mOptimizationLevel;
int mEmitDebugInfo;
int mEmitDebugInfo;
BfOptionFlags mAndFlags;
BfOptionFlags mOrFlags;
Array<MethodFilter> mReflectMethodFilters;
Array<MethodFilter> mReflectMethodAttributeFilters;
int mAllocStackTraceDepth;
int mAllocStackTraceDepth;
public:
static int Apply(int val, int applyVal)
@ -1698,7 +1696,7 @@ public:
if (applyVal != -1)
return applyVal;
return val;
}
}
bool Apply(bool val, BfOptionFlags flags)
{
@ -1722,10 +1720,10 @@ enum BfFindTypeDefFlags
class BfSystem
{
public:
int mPtrSize;
public:
int mPtrSize;
bool mIsResolveOnly;
CritSect mDataLock; // short-lived, hold only while active modifying data
// The following are protected by mDataLock:
HashSet<String> mUsedSafeProjectNames;
@ -1753,11 +1751,11 @@ public:
uint32 mYieldTickCount;
int mHighestYieldTime;
// The following are protected by mSystemLock - can only be accessed by the compiling thread
Dictionary<String, BfTypeDef*> mSystemTypeDefs;
BfTypeDefMap mTypeDefs;
Dictionary<String, BfTypeDef*> mSystemTypeDefs;
BfTypeDefMap mTypeDefs;
bool mNeedsTypesHandledByCompiler;
BumpAllocator mAlloc;
int mAtomCreateIdx;
BumpAllocator mAlloc;
int mAtomCreateIdx;
Dictionary<StringView, BfAtom*> mAtomMap;
Array<BfAtom*> mAtomGraveyard;
uint32 mAtomUpdateIdx;
@ -1792,7 +1790,7 @@ public:
BfTypeDef* mTypeChar16;
BfTypeDef* mTypeChar32;
BfTypeDef* mTypeSingle;
BfTypeDef* mTypeDouble;
BfTypeDef* mTypeDouble;
BfDirectStrTypeReference* mDirectVoidTypeRef;
BfDirectStrTypeReference* mDirectBoolTypeRef;
@ -1808,58 +1806,57 @@ public:
public:
BfSystem();
~BfSystem();
BfAtom* GetAtom(const StringImpl& string);
BfAtom* FindAtom(const StringImpl& string); // Doesn't create a ref
BfAtom* FindAtom(const StringView& string); // Doesn't create a ref
void ReleaseAtom(BfAtom* atom);
void ReleaseAtom(BfAtom* atom);
void ProcessAtomGraveyard();
void RefAtomComposite(const BfAtomComposite& atomComposite);
void ReleaseAtomComposite(const BfAtomComposite& atomComposite);
void ReleaseAtomComposite(const BfAtomComposite& atomComposite);
void SanityCheckAtomComposite(const BfAtomComposite& atomComposite);
void TrackName(BfTypeDef* typeDef);
void UntrackName(BfTypeDef* typeDef);
void UntrackName(BfTypeDef* typeDef);
bool ParseAtomComposite(const StringView& name, BfAtomComposite& composite, bool addRefs = false);
void CreateBasicTypes();
void CreateBasicTypes();
bool DoesLiteralFit(BfTypeCode typeCode, int64 value);
bool DoesLiteralFit(BfTypeCode typeCode, uint64 value);
bool DoesLiteralFit(BfTypeCode typeCode, const BfVariant& variant);
BfParser* CreateParser(BfProject* bfProject);
BfCompiler* CreateCompiler(bool isResolveOnly);
BfParser* CreateParser(BfProject* bfProject);
BfCompiler* CreateCompiler(bool isResolveOnly);
BfProject* GetProject(const StringImpl& projName);
BfTypeReference* GetTypeRefElement(BfTypeReference* typeRef);
BfTypeReference* GetTypeRefElement(BfTypeReference* typeRef);
BfTypeDef* FilterDeletedTypeDef(BfTypeDef* typeDef);
bool CheckTypeDefReference(BfTypeDef* typeDef, BfProject* project);
bool CheckTypeDefReference(BfTypeDef* typeDef, BfProject* project);
BfTypeDef* FindTypeDef(const BfAtomComposite& findName, int numGenericArgs = 0, BfProject* project = NULL, const Array<BfAtomComposite>& namespaceSearch = Array<BfAtomComposite>(), BfTypeDef** ambiguousTypeDef = NULL, BfFindTypeDefFlags flags = BfFindTypeDefFlag_None);
bool FindTypeDef(const BfAtomComposite& findName, int numGenericArgs, BfProject* project, const BfAtomComposite& checkNamespace, bool allowPrivate, BfTypeDefLookupContext* ctx);
BfTypeDef* FindTypeDef(const StringImpl& typeName, int numGenericArgs = 0, BfProject* project = NULL, const Array<BfAtomComposite>& namespaceSearch = Array<BfAtomComposite>(), BfTypeDef** ambiguousTypeDef = NULL, BfFindTypeDefFlags flags = BfFindTypeDefFlag_None);
BfTypeDef* FindTypeDef(const StringImpl& typeName, BfProject* project);
BfTypeDef* FindTypeDefEx(const StringImpl& typeName);
void ClearTypeDefCache();
void FindFixitNamespaces(const StringImpl& typeName, int numGenericArgs, BfProject* project, std::set<String>& fixitNamespaces);
void FindFixitNamespaces(const StringImpl& typeName, int numGenericArgs, BfProject* project, std::set<String>& fixitNamespaces);
void RemoveTypeDef(BfTypeDef* typeDef);
//BfTypeDefMap::Iterator RemoveTypeDef(BfTypeDefMap::Iterator typeDefItr);
void AddNamespaceUsage(const BfAtomComposite& namespaceStr, BfProject* bfProject);
void RemoveNamespaceUsage(const BfAtomComposite& namespaceStr, BfProject* bfProject);
bool ContainsNamespace(const BfAtomComposite& namespaceStr, BfProject* bfProject);
bool ContainsNamespace(const BfAtomComposite& namespaceStr, BfProject* bfProject);
void InjectNewRevision(BfTypeDef* typeDef);
void AddToCompositePartial(BfPassInstance* passInstance, BfTypeDef* compositeTypeDef, BfTypeDef* partialTypeDef);
void FinishCompositePartial(BfTypeDef* compositeTypeDef);
void FinishCompositePartial(BfTypeDef* compositeTypeDef);
void CopyTypeDef(BfTypeDef* typeDef, BfTypeDef* nextTypeDef);
void UpdateEmittedTypeDef(BfTypeDef* typeDef);
BfTypeDef* GetCombinedPartial(BfTypeDef* typeDef);
BfTypeDef* GetOuterTypeNonPartial(BfTypeDef* typeDef);
int GetGenericParamIdx(const Array<BfGenericParamDef*>& genericParams, const StringImpl& name);
int GetGenericParamIdx(const Array<BfGenericParamDef*>& genericParams, BfTypeReference* typeRef);
void StartYieldSection();
void StartYieldSection();
void CheckLockYield(); // Yields to a higher priority request
void SummarizeYieldSection();
@ -1888,7 +1885,7 @@ public:
public:
AutoDisallowYield(BfSystem* system)
{
{
mSystem = system;
mSystem->mYieldDisallowCount++;
mHeld = true;
@ -1921,7 +1918,6 @@ public:
}
};
#ifdef _DEBUG
#ifdef BF_PLATFORM_WINDOWS
@ -1959,7 +1955,6 @@ public:
#define BfLogX(logIdx, fmt, ...) {} // Nothing
#endif
#ifdef BF_WANTS_LOG_SYS
#define BfLogSys(sys, fmt, ...) DoBfLog((sys)->mIsResolveOnly ? 1 : 2, fmt, ##__VA_ARGS__)
#define BfLogSysM(fmt, ...) DoBfLog(mSystem->mIsResolveOnly ? 1 : 2, fmt, ##__VA_ARGS__)
@ -2035,7 +2030,6 @@ namespace std
};
}
namespace std
{
template<>

View file

@ -39,4 +39,4 @@ BfMachineType BfTargetTriple::GetMachineType()
if (!mParsed)
Parse();
return mMachineType;
}
}

View file

@ -3,5 +3,4 @@
NS_BF_BEGIN
NS_BF_END

View file

@ -60,7 +60,7 @@ String Beefy::EncodeFileName(const StringImpl& fromStr)
path.Insert(0, fromStr.mPtr, 80);
else
path += fromStr;
path.Replace("$", "\\");
for (auto& c : path)
{
@ -178,7 +178,7 @@ bool Beefy::BfCheckWildcard(const StringImpl& wildcard, const StringImpl& checkS
break;
}
prevFilterC = filterC;
prevFilterC = filterC;
}
return matched;

View file

@ -41,7 +41,7 @@ public:
public:
SetAndRestoreValue()
{
mVarPtr = NULL;
mVarPtr = NULL;
}
SetAndRestoreValue(T& varRef)
@ -54,14 +54,14 @@ public:
SetAndRestoreValue(T& varRef, T newVal)
{
mPrevVal = varRef;
mVarPtr = &varRef;
mVarPtr = &varRef;
varRef = newVal;
mNewVal = newVal;
}
SetAndRestoreValue(T& varRef, T newVal, bool doSet)
{
mPrevVal = varRef;
mPrevVal = varRef;
mVarPtr = &varRef;
if (doSet)
varRef = newVal;
@ -183,14 +183,14 @@ public:
mVals.pop_back();
return val;
}
if (mZeroAlloc)
{
void* addr = malloc(sizeof(T));
memset(addr, 0, sizeof(T));
val = new(addr) T();
}
else
else
val = new T();
if (mOwnsAll)
mVals.push_back(val);
@ -226,15 +226,15 @@ inline void EncodeSLEB128(uint8*& buf, int value)
bool hasMore;
do
{
uint8 curByte = (uint8)(value & 0x7f);
uint8 curByte = (uint8)(value & 0x7f);
value >>= 7;
hasMore = !((((value == 0) && ((curByte & 0x40) == 0)) ||
((value == -1) && ((curByte & 0x40) != 0))));
if (hasMore)
curByte |= 0x80;
*(buf++) = curByte;
*(buf++) = curByte;
}
while (hasMore);
while (hasMore);
}
inline void EncodeSLEB128(uint8*& buf, int64_t value)
@ -242,15 +242,15 @@ inline void EncodeSLEB128(uint8*& buf, int64_t value)
bool hasMore;
do
{
uint8 curByte = (uint8)(value & 0x7f);
uint8 curByte = (uint8)(value & 0x7f);
value >>= 7;
hasMore = !((((value == 0) && ((curByte & 0x40) == 0)) ||
((value == -1) && ((curByte & 0x40) != 0))));
if (hasMore)
curByte |= 0x80;
*(buf++) = curByte;
*(buf++) = curByte;
}
while (hasMore);
while (hasMore);
}
#pragma warning(push)
@ -258,7 +258,7 @@ inline void EncodeSLEB128(uint8*& buf, int64_t value)
/// Utility function to decode a SLEB128 value.
inline int64_t DecodeSLEB128(const uint8*& p)
{
{
int value = 0;
int shift = 0;
int curByte;
@ -267,7 +267,6 @@ inline int64_t DecodeSLEB128(const uint8*& p)
curByte = (uint8_t)*p++;
value |= ((curByte & 0x7f) << shift);
shift += 7;
} while (curByte >= 128);
// Sign extend negative numbers.
if (((curByte & 0x40) != 0) && (shift < 64))

View file

@ -10,4 +10,4 @@ BfVarDeclChecker::BfVarDeclChecker()
void BfVarDeclChecker::Visit(BfVariableDeclaration * binOpExpr)
{
mHasVarDecl = true;
}
}

View file

@ -17,5 +17,4 @@ public:
virtual void Visit(BfVariableDeclaration* binOpExpr) override;
};
NS_BF_END

File diff suppressed because it is too large Load diff

View file

@ -29,7 +29,7 @@ public:
class CeBreakpoint : public Breakpoint
{
public:
public:
uintptr mCurBindAddr;
bool mHasBound;
int mIdx;
@ -37,7 +37,7 @@ public:
public:
CeBreakpoint()
{
{
mCurBindAddr = 1;
mHasBound = false;
mIdx = -1;
@ -62,7 +62,7 @@ struct CeFormatInfo
intptr mArrayLength;
intptr mOverrideCount;
intptr mMaxCount;
DwDisplayType mDisplayType;
DwDisplayType mDisplayType;
int mTotalSummaryLength;
String mReferenceId;
String mSubjectExpr;
@ -86,7 +86,7 @@ struct CeFormatInfo
mMaxCount = -1;
mTotalSummaryLength = 0;
mDisplayType = DwDisplayType_NotSpecified;
mExpandItemDepth = 0;
mExpandItemDepth = 0;
}
};
@ -99,7 +99,7 @@ public:
BfPassInstance* mPassInstance;
BfExprEvaluator* mExprEvaluator;
BfExpression* mExprNode;
BfTypedValue mResultOverride;
BfTypedValue mResultOverride;
String mExprString;
BfTypedValue mExplicitThis;
@ -110,7 +110,7 @@ public:
void Init(CeDebugger* winDebugger, const StringImpl& expr, CeFormatInfo* formatInfo = NULL, BfTypedValue contextValue = BfTypedValue());
bool HasExpression();
~CeEvaluationContext();
BfTypedValue EvaluateInContext(BfTypedValue contextTypedValue, CeDbgState* dbgState = NULL);
BfTypedValue EvaluateInContext(BfTypedValue contextTypedValue, CeDbgState* dbgState = NULL);
String GetErrorStr();
bool HadError();
};
@ -153,9 +153,9 @@ public:
BfAstNode* mExprNode;
String mReferenceId;
int mCallStackIdx;
String mResult;
String mResult;
int mIdleTicks;
String mException;
String mException;
bool mDone;
CePendingExpr();
@ -197,7 +197,7 @@ public:
{
public:
int mFieldIdx;
int64 mVal;
int64 mVal;
};
public:
@ -243,16 +243,16 @@ public:
CeMachine* mCeMachine;
DebugManager* mDebugManager;
CePendingExpr* mDebugPendingExpr;
CeDbgState* mCurDbgState;
CeDbgState* mCurDbgState;
Array<CeBreakpoint*> mBreakpoints;
Dictionary<String, CeFileInfo*> mFileInfo;
Dictionary<String, CeFileInfo*> mFileInfo;
Dictionary<int, CeDbgTypeInfo> mDbgTypeInfoMap;
Array<CeDbgStackInfo> mDbgCallStack;
CeEvaluationContext* mCurEvaluationContext;
CeBreakpoint* mActiveBreakpoint;
int mBreakpointVersion;
bool mBreakpointCacheDirty;
bool mBreakpointCacheDirty;
bool mBreakpointFramesDirty;
int mCurDisasmFuncId;
int mPendingActiveFrameOffset;
@ -270,7 +270,7 @@ public:
bool CheckConditionalBreakpoint(CeBreakpoint* breakpoint);
bool SetupStep(int frameIdx = 0);
CeFrame* GetFrame(int callStackIdx);
CeFrame* GetFrame(int callStackIdx);
String DoEvaluate(CePendingExpr* pendingExpr, bool inCompilerThread);
String Evaluate(const StringImpl& expr, CeFormatInfo formatInfo, int callStackIdx, int cursorPos, int language, DwEvalExpressionFlags expressionFlags);
DwDisplayInfo* GetDisplayInfo(const StringImpl& referenceId);
@ -296,7 +296,7 @@ public:
void UpdateBreakpointCache();
void UpdateBreakpointFrames();
void UpdateBreakpointAddrs();
void UpdateBreakpoints(CeFunction* ceFunction);
void UpdateBreakpoints(CeFunction* ceFunction);
void Continue();
CeDbgTypeInfo* GetDbgTypeInfo(int typeId);
CeDbgTypeInfo* GetDbgTypeInfo(BfIRType irType);
@ -346,7 +346,7 @@ public:
virtual void StepIntoSpecific(intptr addr) override;
virtual void StepOver(bool inAssembly) override;
virtual void StepOut(bool inAssembly) override;
virtual void SetNextStatement(bool inAssembly, const StringImpl& fileName, int64 lineNumOrAsmAddr, int wantColumn) override;
virtual void SetNextStatement(bool inAssembly, const StringImpl& fileName, int64 lineNumOrAsmAddr, int wantColumn) override;
//virtual DbgTypedValue GetRegister(const StringImpl& regName, CPURegisters* registers, Array<RegForm>* regForms = NULL) override;
virtual String Evaluate(const StringImpl& expr, int callStackIdx, int cursorPos, int language, DwEvalExpressionFlags expressionFlags) override;
virtual String EvaluateContinue() override;

File diff suppressed because it is too large Load diff

View file

@ -80,17 +80,17 @@ enum CeOp : int16
CeOp_JmpIf,
CeOp_JmpIfNot,
CeOp_Error,
CeOp_Error,
CeOp_DynamicCastCheck,
CeOp_GetReflectType,
CeOp_GetString,
CeOp_Malloc,
CeOp_Free,
CeOp_MemSet,
CeOp_MemSet_Const,
CeOp_MemCpy,
CeOp_FrameAddr_32,
CeOp_FrameAddr_64,
CeOp_FrameAddrOfs_32,
@ -116,7 +116,7 @@ enum CeOp : int16
CeOp_GetMethod_Virt,
CeOp_GetMethod_IFace,
CeOp_Call,
CeOp_Conv_I8_I16,
CeOp_Conv_I8_I32,
CeOp_Conv_I8_I64,
@ -128,7 +128,7 @@ enum CeOp : int16
CeOp_Conv_I16_F64,
CeOp_Conv_I32_I64,
CeOp_Conv_I32_F32,
CeOp_Conv_I32_F64,
CeOp_Conv_I32_F64,
CeOp_Conv_I64_F32,
CeOp_Conv_I64_F64,
CeOp_Conv_U8_U16,
@ -168,7 +168,7 @@ enum CeOp : int16
CEOP_SIZED_NUMERIC_PLUSF(AddConst),
CEOP_SIZED_NUMERIC_PLUSF(Add),
CEOP_SIZED_NUMERIC_PLUSF(Sub),
CEOP_SIZED_NUMERIC_PLUSF(Mul),
CEOP_SIZED_NUMERIC_PLUSF(Mul),
CEOP_SIZED_NUMERIC_PLUSF(Div),
CEOP_SIZED_UNUMERIC(Div),
CEOP_SIZED_NUMERIC_PLUSF(Mod),
@ -179,7 +179,7 @@ enum CeOp : int16
CEOP_SIZED_NUMERIC(Shl),
CEOP_SIZED_NUMERIC(Shr),
CEOP_SIZED_UNUMERIC(Shr),
CEOP_SIZED_FLOAT(Acos),
CEOP_SIZED_FLOAT(Asin),
CEOP_SIZED_FLOAT(Atan),
@ -190,7 +190,7 @@ enum CeOp : int16
CEOP_SIZED_FLOAT(Exp),
CEOP_SIZED_FLOAT(Floor),
CEOP_SIZED_FLOAT(Log),
CEOP_SIZED_FLOAT(Log10),
CEOP_SIZED_FLOAT(Log10),
CEOP_SIZED_FLOAT(Pow),
CEOP_SIZED_FLOAT(Round),
CEOP_SIZED_FLOAT(Sin),
@ -198,7 +198,7 @@ enum CeOp : int16
CEOP_SIZED_FLOAT(Sqrt),
CEOP_SIZED_FLOAT(Tan),
CEOP_SIZED_FLOAT(Tanh),
CEOP_SIZED_NUMERIC_PLUSF(Cmp_EQ),
CEOP_SIZED_NUMERIC_PLUSF(Cmp_NE),
CEOP_SIZED_NUMERIC_PLUSF(Cmp_SLT),
@ -307,7 +307,7 @@ public:
};
struct CeDbgInlineEntry
{
{
int mScope;
int mLine;
int mColumn;
@ -329,7 +329,7 @@ public:
mCeFunction = NULL;
mRefCount = 0;
}
~CeFunctionInfo();
BfTypeInstance* GetOwner()
@ -447,14 +447,14 @@ enum CeFunctionKind
CeFunctionKind_Method_GetInfo,
CeFunctionKind_Method_GetParamInfo,
CeFunctionKind_Method_GetGenericArg,
CeFunctionKind_SetReturnType,
CeFunctionKind_EmitTypeBody,
CeFunctionKind_EmitAddInterface,
CeFunctionKind_EmitMethodEntry,
CeFunctionKind_EmitMethodExit,
CeFunctionKind_EmitMixin,
CeFunctionKind_BfpDirectory_Create,
CeFunctionKind_BfpDirectory_Rename,
CeFunctionKind_BfpDirectory_Delete,
@ -483,7 +483,7 @@ enum CeFunctionKind
CeFunctionKind_BfpFile_GetTempFileName,
CeFunctionKind_BfpFile_GetFullPath,
CeFunctionKind_BfpFile_GetActualPath,
CeFunctionKind_BfpFindFileData_FindFirstFile,
CeFunctionKind_BfpFindFileData_FindNextFile,
CeFunctionKind_BfpFindFileData_GetFileName,
@ -521,7 +521,7 @@ enum CeFunctionKind
CeFunctionKind_Math_Asin,
CeFunctionKind_Math_Atan,
CeFunctionKind_Math_Atan2,
CeFunctionKind_Math_Ceiling,
CeFunctionKind_Math_Ceiling,
CeFunctionKind_Math_Cos,
CeFunctionKind_Math_Cosh,
CeFunctionKind_Math_Exp,
@ -535,7 +535,7 @@ enum CeFunctionKind
CeFunctionKind_Math_Sinh,
CeFunctionKind_Math_Sqrt,
CeFunctionKind_Math_Tan,
CeFunctionKind_Math_Tanh,
CeFunctionKind_Math_Tanh,
};
class CeConstStructFixup
@ -596,14 +596,14 @@ public:
{
mTypeId = -1;
mSize = 0;
mAddr = 0;
mBindExecuteId = -1;
mAddr = 0;
mBindExecuteId = -1;
}
};
class CeDbgVariable
{
public:
public:
String mName;
CeOperand mValue;
BfType* mType;
@ -641,17 +641,17 @@ public:
CeMachine* mCeMachine;
CeFunctionInfo* mCeFunctionInfo;
CeInnerFunctionInfo* mCeInnerFunctionInfo;
BfMethodInstance* mMethodInstance;
CeFunctionKind mFunctionKind;
BfMethodInstance* mMethodInstance;
CeFunctionKind mFunctionKind;
InitializeState mInitializeState;
bool mFailed;
bool mIsVarReturn;
Array<uint8> mCode;
Array<uint8> mCode;
Array<CeDbgScope> mDbgScopes;
Array<CeDbgInlineEntry> mDbgInlineTable;
Array<CeDbgMethodRef> mDbgMethodRefTable;
Array<CeEmitEntry> mEmitTable;
Array<CeCallEntry> mCallTable;
Array<CeEmitEntry> mEmitTable;
Array<CeCallEntry> mCallTable;
Array<CeStringEntry> mStringTable;
Array<CeConstStructData> mConstStructTable;
Array<CeStaticFieldEntry> mStaticFieldTable;
@ -659,7 +659,7 @@ public:
Array<CeFunction*> mInnerFunctions;
Dictionary<int, CeBreakpointBind> mBreakpoints;
String mGenError;
int mFrameSize;
int mFrameSize;
int mMaxReturnSize;
int mId;
int mBreakpointVersion;
@ -671,7 +671,7 @@ public:
mCeMachine = NULL;
mCeFunctionInfo = NULL;
mCeInnerFunctionInfo = NULL;
mFunctionKind = CeFunctionKind_NotSet;
mFunctionKind = CeFunctionKind_NotSet;
mInitializeState = InitializeState_None;
mMethodInstance = NULL;
mFailed = false;
@ -681,7 +681,7 @@ public:
mBreakpointVersion = 0;
mId = -1;
mDbgInfo = NULL;
}
}
~CeFunction();
void Print();
@ -747,7 +747,7 @@ enum CeSizeClass
class CeDumpContext
{
public:
public:
Dictionary<int, CeDbgVariable*> mVarMap;
CeFunction* mCeFunction;
String mStr;
@ -765,13 +765,13 @@ public:
void DumpOperandInfo(CeOperandInfoKind operandInfoKind);
void Next();
void Dump();
void Dump();
};
struct CePhiOutgoing
{
BeValue* mPhiValue;
BePhiInst* mPhiInst;
BePhiInst* mPhiInst;
int mPhiBlockIdx;
};
@ -784,7 +784,7 @@ public:
public:
CeBlock()
{
mEmitOfs = -1;
mEmitOfs = -1;
}
};
@ -811,7 +811,7 @@ struct CeDbgInlineLookup
mDbgFile = NULL;
mInlineAtIdx = -1;
}
bool operator==(const CeDbgInlineLookup& second) const
{
return (mDbgFile == second.mDbgFile) && (mDbgFile == second.mDbgFile);
@ -820,18 +820,18 @@ struct CeDbgInlineLookup
class CeBuilder
{
public:
public:
CeBuilder* mParentBuilder;
CeMachine* mCeMachine;
CeMachine* mCeMachine;
CeFunction* mCeFunction;
BeFunction* mBeFunction;
BeFunction* mBeFunction;
CeOperand mReturnVal;
BeType* mIntPtrType;
int mPtrSize;
int mPtrSize;
String mError;
BeDbgLoc* mCurDbgLoc;
Array<CeBlock> mBlocks;
Array<CeBlock> mBlocks;
Array<CeJumpEntry> mJumpTable;
Dictionary<BeValue*, CeOperand> mValueToOperand;
int mFrameSize;
@ -845,7 +845,7 @@ public:
Dictionary<BeGlobalVariable*, int> mStaticFieldMap;
Dictionary<String, BfFieldInstance*> mStaticFieldInstanceMap;
Dictionary<BeValue*, int> mDbgVariableMap;
public:
CeBuilder()
{
@ -857,7 +857,7 @@ public:
mCurDbgLoc = NULL;
mFrameSize = 0;
}
void Fail(const StringImpl& error);
CeOperand FrameAlloc(BeType* type);
@ -871,7 +871,7 @@ public:
int GetCodePos();
void HandleParams();
void Emit(uint8 val);
void Emit(CeOp val);
void EmitSizedOp(CeOp val, int size);
@ -881,7 +881,7 @@ public:
void Emit(void* ptr, int size);
void EmitZeroes(int size);
void EmitJump(CeOp op, const CeOperand& block);
void EmitBinarySwitchSection(BeSwitchInst* switchInst, int startIdx, int endIdx);
void EmitBinarySwitchSection(BeSwitchInst* switchInst, int startIdx, int endIdx);
void EmitFrameOffset(const CeOperand& val);
void FlushPhi(CeBlock* ceBlock, int targetBlockIdx);
@ -920,7 +920,7 @@ public:
class CeStaticFieldInfo
{
public:
public:
addr_ce mAddr;
public:
@ -970,16 +970,16 @@ public:
class CeEmitContext
{
public:
BfType* mType;
BfType* mType;
BfMethodInstance* mMethodInstance;
Array<int32> mInterfaces;
Array<int32> mInterfaces;
String mEmitData;
String mExitEmitData;
bool mFailed;
CeEmitContext()
{
mType = NULL;
mType = NULL;
mMethodInstance = NULL;
mFailed = false;
}
@ -1088,15 +1088,15 @@ public:
int mExecuteId;
CeEvalFlags mCurEvalFlags;
// These are only valid for the current execution
// These are only valid for the current execution
ContiguousHeap* mHeap;
Array<CeFrame> mCallStack;
Array<uint8> mMemory;
int mStackSize;
Dictionary<int, addr_ce> mStringMap;
Dictionary<int, addr_ce> mReflectMap;
Dictionary<Val128, addr_ce> mConstDataMap;
HashSet<int> mStaticCtorExecSet;
Dictionary<Val128, addr_ce> mConstDataMap;
HashSet<int> mStaticCtorExecSet;
Dictionary<String, CeStaticFieldInfo> mStaticFieldMap;
Dictionary<int, CeInternalData*> mInternalDataMap;
int mCurHandleId;
@ -1109,16 +1109,16 @@ public:
CeCallSource* mCurCallSource;
BfModule* mCurModule;
CeFrame* mCurFrame;
CeEmitContext* mCurEmitContext;
CeEmitContext* mCurEmitContext;
String mWorkingDir;
public:
CeContext();
~CeContext();
BfError* Fail(const StringImpl& error);
BfError* Fail(const CeFrame& curFrame, const StringImpl& error);
void CalcWorkingDir();
void FixRelativePath(StringImpl& path);
bool AddRebuild(const CeRebuildKey& key, const CeRebuildValue& value);
@ -1143,8 +1143,8 @@ public:
bool GetCustomAttribute(BfModule* module, BfIRConstHolder* constHolder, BfCustomAttributes* customAttributes, int attributeIdx, addr_ce resultAddr);
BfType* GetCustomAttributeType(BfCustomAttributes* customAttributes, int attributeIdx);
bool WriteConstant(BfModule* module, addr_ce addr, BfConstant* constant, BfType* type, bool isParams = false);
BfIRValue CreateConstant(BfModule* module, uint8* ptr, BfType* type, BfType** outType = NULL);
bool WriteConstant(BfModule* module, addr_ce addr, BfConstant* constant, BfType* type, bool isParams = false);
BfIRValue CreateConstant(BfModule* module, uint8* ptr, BfType* type, BfType** outType = NULL);
BfIRValue CreateAttribute(BfAstNode* targetSrc, BfModule* module, BfIRConstHolder* constHolder, BfCustomAttribute* customAttribute, addr_ce ceAttrAddr = 0);
bool Execute(CeFunction* startFunction, uint8* startStackPtr, uint8* startFramePtr, BfType*& returnType, BfType*& castReturnType);
@ -1173,14 +1173,14 @@ public:
Kind_Evaluate
};
Kind mKind;
Kind mKind;
int mNextInstIdx;
int mStartDepth;
public:
CeStepState()
{
mKind = Kind_None;
mKind = Kind_None;
mNextInstIdx = -1;
mStartDepth = 0;
}
@ -1194,24 +1194,24 @@ public:
Dictionary<int, CeFunction*> mFunctionIdMap; // Only used for 32-bit and debugging
Dictionary<BfType*, CeTypeInfo> mTypeInfoMap;
HashSet<BfMethodInstance*> mMethodInstanceSet;
HashSet<BfFieldInstance*> mFieldInstanceSet;
HashSet<BfFieldInstance*> mFieldInstanceSet;
Array<CeContext*> mContextList;
BfCompiler* mCompiler;
BfModule* mCeModule;
int mRevision;
int mMethodBindRevision;
int mRevisionExecuteTime;
int mCurFunctionId;
int mRevisionExecuteTime;
int mCurFunctionId;
int mExecuteId;
CeAppendAllocInfo* mAppendAllocInfo;
CeAppendAllocInfo* mAppendAllocInfo;
CeContext* mCurContext;
CeEmitContext* mCurEmitContext;
CeCallSource* mCurCallSource;
CeBuilder* mCurBuilder;
CeFunction* mPreparingFunction;
CeFunction* mPreparingFunction;
BfParser* mTempParser;
BfReducer* mTempReducer;
@ -1221,27 +1221,27 @@ public:
SyncEvent mDebugEvent;
CeStepState mStepState;
CeDebugger* mDebugger;
bool mDbgPaused;
bool mDbgPaused;
bool mSpecialCheck;
bool mDbgWantBreak;
public:
CeMachine(BfCompiler* compiler);
~CeMachine();
~CeMachine();
void Init();
void Init();
BeContext* GetBeContext();
BeModule* GetBeModule();
int GetInstSize(CeFunction* ceFunction, int instIdx);
void DerefMethodInfo(CeFunctionInfo* ceFunctionInfo);
void RemoveFunc(CeFunction* ceFunction);
void RemoveMethod(BfMethodInstance* methodInstance);
void CreateFunction(BfMethodInstance* methodInstance, CeFunction* ceFunction);
CeErrorKind WriteConstant(CeConstStructData& data, BeConstant* constVal, CeContext* ceContext);
void RemoveMethod(BfMethodInstance* methodInstance);
void CreateFunction(BfMethodInstance* methodInstance, CeFunction* ceFunction);
CeErrorKind WriteConstant(CeConstStructData& data, BeConstant* constVal, CeContext* ceContext);
void CheckFunctionKind(CeFunction* ceFunction);
void PrepareFunction(CeFunction* methodInstance, CeBuilder* parentBuilder);
void PrepareFunction(CeFunction* methodInstance, CeBuilder* parentBuilder);
void MapFunctionId(CeFunction* ceFunction);
void CheckFunctions();
@ -1249,14 +1249,14 @@ public:
CeFunction* GetPreparedFunction(BfMethodInstance* methodInstance);
CeTypeInfo* GetTypeInfo(BfType* type);
BfMethodInstance* GetMethodInstance(int64 methodHandle);
BfFieldInstance* GetFieldInstance(int64 fieldHandle);
BfFieldInstance* GetFieldInstance(int64 fieldHandle);
public:
void CompileStarted();
void CompileDone();
CeFunction* QueueMethod(BfMethodInstance* methodInstance, BfIRValue func);
void QueueMethod(BfModuleMethodInstance moduleMethodInstance);
void QueueStaticField(BfFieldInstance* fieldInstance, const StringImpl& mangledFieldName);
void QueueStaticField(BfFieldInstance* fieldInstance, const StringImpl& mangledFieldName);
void SetAppendAllocInfo(BfModule* module, BfIRValue allocValue, BfIRValue appendSizeValue);
void ClearAppendAllocInfo();
@ -1277,7 +1277,7 @@ namespace std
{
return BeefHash<Beefy::String>()(key.mString) ^ (size_t)key.mKind;
}
};
};
template <>
struct hash<Beefy::CeDbgInlineLookup>

View file

@ -16,7 +16,7 @@ MemReporter::~MemReporter()
int MemReporter::GetChildSizes(Entry* entry)
{
int childSizes = 0;
for (auto& childPair : entry->mChildren)
for (auto& childPair : entry->mChildren)
{
auto child = childPair.mValue;
childSizes += child->mSize + GetChildSizes(child);
@ -29,10 +29,10 @@ void MemReporter::Report(int depth, Entry* entry)
String str;
for (int i = 0; i < depth; i++)
str += " ";
str += entry->mName;
while (str.length() < 64)
str += ' ';
str += ' ';
if (entry->mChildSize == -1)
entry->mChildSize = GetChildSizes(entry);
@ -45,7 +45,7 @@ void MemReporter::Report(int depth, Entry* entry)
Array<Entry*> entries;
for (auto& kv : entry->mChildren)
{
{
auto* entry = kv.mValue;
entry->mChildSize = GetChildSizes(entry);
entries.Add(kv.mValue);
@ -63,7 +63,7 @@ void MemReporter::BeginSection(const StringView& name)
{
Entry** entryPtr;
if (!mCurEntry->mChildren.TryAdd(StringImpl::MakeRef(name), NULL, &entryPtr))
{
{
mCurEntry = *entryPtr;
mCurEntry->mCount++;
return;
@ -95,6 +95,6 @@ void MemReporter::EndSection()
}
void MemReporter::Report()
{
{
Report(0, &mRoot);
}
}

View file

@ -36,24 +36,24 @@ public:
Entry* mCurEntry;
bool mShowInKB;
public:
public:
int GetChildSizes(Entry* entry);
void Report(int depth, Entry* entry);
public:
public:
MemReporter();
~MemReporter();
void BeginSection(const StringView& name);
void Add(int size);
void Add(const StringView& name, int size);
template <typename T>
void AddVec(const T& vec, bool addContainerSize = true)
{
Add((addContainerSize ? sizeof(T) : 0) + (int)vec.mAllocSize * sizeof(typename T::value_type));
}
template <typename T>
void AddVec(const StringView& name, const T& vec, bool addContainerSize = true)
{
@ -61,21 +61,21 @@ public:
Add((addContainerSize ? sizeof(T) : 0) + (int)vec.mAllocSize * sizeof(typename T::value_type));
EndSection();
}
template <typename T>
void AddVecPtr(const std::vector<T>& vec, bool addContainerSize = true)
{
Add((addContainerSize ? sizeof(T) : 0) +
(int)vec.capacity() * sizeof(T) +
(int)vec.capacity() * sizeof(T) +
(int)vec.size() * sizeof(typename std::remove_pointer<T>::type)); //-V220
}
template <typename T>
void AddVecPtr(const Array<T>& vec, bool addContainerSize = true)
{
Add((addContainerSize ? sizeof(T) : 0) +
(int)vec.mAllocSize * sizeof(T) +
(int)vec.size() * sizeof(typename std::remove_pointer<T>::type)); //-V220
(int)vec.size() * sizeof(typename std::remove_pointer<T>::type)); //-V220
}
template <typename T>
@ -83,12 +83,12 @@ public:
{
Add(name, (addContainerSize ? sizeof(T) : 0) +
(int)vec.mAllocSize * sizeof(T) +
(int)vec.size() * sizeof(typename std::remove_pointer<T>::type)); //-V220
(int)vec.size() * sizeof(typename std::remove_pointer<T>::type)); //-V220
}
template <typename T>
void AddMap(const StringView& name, const T& map, bool addContainerSize = true)
{
{
Add(name, (addContainerSize ? sizeof(T) : 0) + map.mAllocSize * (sizeof(typename T::EntryPair) + sizeof(typename T::int_cosize)));
}
@ -109,7 +109,7 @@ public:
{
Add((addContainerSize ? sizeof(T) : 0) + map.mAllocSize * (sizeof(typename T::Entry) + sizeof(typename T::int_cosize)));
}
void AddStr(const StringImpl& str, bool addContainerSize = true)
{
Add((addContainerSize ? sizeof(StringImpl) : 0) + (int)str.GetAllocSize());
@ -123,12 +123,11 @@ public:
void EndSection();
void Report();
template <typename T>
void AddBumpAlloc(const StringView& name, const T& alloc)
{
{
BeginSection(name);
int usedSize = alloc.CalcUsedSize();
#ifdef BUMPALLOC_TRACKALLOCS
@ -162,9 +161,9 @@ public:
Add("Unaccounted", usedSizeLeft);
#else
Add("Used", usedSize);
#endif
#endif
Add("Waste", alloc.GetAllocSize() - usedSize);
Add("Unused", alloc.GetTotalAllocSize() - alloc.GetAllocSize());
Add("Unused", alloc.GetTotalAllocSize() - alloc.GetAllocSize());
EndSection();
}
@ -173,7 +172,7 @@ public:
class AutoMemReporter
{
public:
MemReporter* mMemReporter;
MemReporter* mMemReporter;
public:
AutoMemReporter(MemReporter* memReporter, const StringImpl& name)

View file

@ -3,7 +3,7 @@
USING_NS_BF;
enum DbgMiniDumpFlags
enum DbgMiniDumpFlags
{
DbgMiniDumpFlag_MiniDumpNormal = 0x00000000,
DbgMiniDumpFlag_MiniDumpWithDataSegs = 0x00000001,
@ -41,18 +41,18 @@ bool DbgMiniDump::StartLoad(const StringImpl& path)
uint32 mVersion;
uint32 mNumberOfStreams;
uint32 mStreamDirectoryRVA;
uint32 mCheckSum;
uint32 TimeDateStamp;
uint32 mCheckSum;
uint32 TimeDateStamp;
uint64 Flags;
};
_Header& header = *(_Header*)((uint8*)mMF.mData);
_Header& header = *(_Header*)((uint8*)mMF.mData);
if (header.mSignature != 'PMDM')
return false;
mDirectory.mVals = (StreamDirectoryEntry*)((uint8*)mMF.mData + header.mStreamDirectoryRVA);
mDirectory.mSize = header.mNumberOfStreams;
return true;
}
@ -72,4 +72,4 @@ int DbgMiniDump::GetTargetBitCount()
}
return 0;
}
}

View file

@ -46,7 +46,7 @@ public:
bool StartLoad(const StringImpl& path);
int GetTargetBitCount();
template <typename T>
template <typename T>
T& GetStreamData(const StreamDirectoryEntry& entry)
{
return *(T*)((uint8*)mMF.mData + entry.mDataRVA);

View file

@ -80,7 +80,7 @@ DebugManager::DebugManager()
mStepOverExternalFiles = false;
mDebugger32 = NULL;
mDebugger64 = NULL;
mDebugger64 = NULL;
mNetManager = new NetManager();
mNetManager->mDebugManager = this;
@ -106,12 +106,11 @@ DebugManager::~DebugManager()
delete mNetManager;
delete mDebugger64;
delete mDebugger32;
delete mDebugger32;
/*for (auto stepFilter : mStepFilters)
{
}*/
delete mDebugVisualizers;
delete mDebugVisualizers;
}
void DebugManager::OutputMessage(const StringImpl& msg)
@ -144,7 +143,6 @@ void DebugManager::SetSourceServerCacheDir()
#endif
}
//#define CAPTURE_ALLOC_BACKTRACE
//#define CAPTURE_ALLOC_SOURCES
@ -153,7 +151,7 @@ const int sNumAllocAddrs = 0x300000;
const int sCaptureDepth = 14;
const int sCaptureOffset = 4;
static intptr gAllocAddrs[sNumAllocAddrs][sCaptureDepth];
#endif
#endif
#ifdef CAPTURE_ALLOC_SOURCES
#include <Dbghelp.h>
@ -191,7 +189,7 @@ static void ReallocEntry(long oldRequest, long newRequest, int newSize)
entry->mAllocSize = newSize;
gBfCaptureSourceAllocMap[newRequest] = *entry;
gBfCaptureSourceAllocMap.erase(itr);
}
}
}
static void RemoveAllocEntry(long lRequest)
@ -203,13 +201,11 @@ static void RemoveAllocEntry(long lRequest)
entry->mLoc->mTotalSize -= entry->mAllocSize;
gBfCaptureSourceAllocMap.erase(itr);
}
}
}
//const LOC_HASHES
#endif
static int gBfNumAllocs = 0;
@ -246,7 +242,7 @@ static int BfAllocHook(int nAllocType, void *pvData,
if (hProcess == NULL)
{
hProcess = GetCurrentProcess();
BOOL worked = SymInitialize(hProcess, NULL, TRUE);
BOOL worked = SymInitialize(hProcess, NULL, TRUE);
}
if (nAllocType == _HOOK_ALLOC)
@ -317,7 +313,6 @@ static int BfAllocHook(int nAllocType, void *pvData,
if ((captureAllocLoc->mIsEndpoint) && (foundSym))
{
}
gHashCaptureAllocSize[hashVal] = captureAllocLoc;
@ -330,7 +325,6 @@ static int BfAllocHook(int nAllocType, void *pvData,
continue;
}
captureAllocLoc->mTotalSize += (int)nSize;
CaptureAllocEntry entry;
@ -433,19 +427,18 @@ static int BfAllocHook(int nAllocType, void *pvData,
#endif //BF_PLATFORM_WINDOWS
void BfReportMemory()
{
BfLogDbg("Used: %.2fM NumAllocs: %d Allocs: %.2fM\n", (gBfAllocCount - gBfFreeCount) / (1024.0 * 1024.0), gBfNumAllocs, gBfAllocCount / (1024.0 * 1024.0));
}
void BfFullReportMemory()
{
{
/*OutputDebugStrF("Testing OOB\n");
char* str = new char[12];
delete str;
char c = str[1];*/
if (gBfParserCache != NULL)
{
MemReporter memReporter;
@ -457,7 +450,7 @@ void BfFullReportMemory()
OutputDebugStrF("Used: %.2fM NumAllocs: %d Allocs: %.2fM\n", (gBfAllocCount - gBfFreeCount) / (1024.0 * 1024.0), gBfNumAllocs, gBfAllocCount / (1024.0 * 1024.0));
OutputDebugStrF("ChunkedDataBuffer allocated blocks: %d\n", ChunkedDataBuffer::sBlocksAllocated);
if (gDebugManager != NULL)
{
MemReporter memReporter;
@ -493,7 +486,7 @@ void BfFullReportMemory()
for (auto kv : byNameMap)
{
//OutputDebugStrF("%dk %s\n", (kv.second + 1023) / 1024, kv.first.c_str());
//OutputDebugStrF("%dk %s\n", (kv.second + 1023) / 1024, kv.first.c_str());
bySizeMap.insert(std::multimap<int, String>::value_type(-kv.second, kv.first));
}
@ -528,7 +521,7 @@ struct _CrtMemBlockHeader
//static _CrtMemBlockHeader* __acrt_last_block;
void ShowMemoryUsage()
{
{
#ifdef BF_PLATFORM_WINDOWS
PROCESS_MEMORY_COUNTERS processMemCounters;
processMemCounters.cb = sizeof(PROCESS_MEMORY_COUNTERS);
@ -538,7 +531,7 @@ void ShowMemoryUsage()
static bool hasCheckpoint = true;
_CrtMemState memState;
_CrtMemCheckpoint(&memState);
_CrtMemCheckpoint(&memState);
//OutputDebugStrF("Crt Size: %dk\n", (int)(memState.lTotalCount / 1024));
char* names[6] = { "_FREE_BLOCK", "_NORMAL_BLOCK", "_CRT_BLOCK", "_IGNORE_BLOCK", "_CLIENT_BLOCK", "_MAX_BLOCKS" };
@ -546,7 +539,7 @@ void ShowMemoryUsage()
{
OutputDebugStrF("%s : %d %dk\n", names[i], memState.lCounts[i], memState.lSizes[i] / 1024);
}
#ifdef _DEBUG
// int64 totalCrtSize = 0;
// int64 totalUseCrtSize = 0;
@ -568,9 +561,9 @@ void ShowMemoryUsage()
while ((heapStatus = _heapwalk(&heapInfo)) == _HEAPOK)
{
heapSize += (int64)heapInfo._size;
}
}
OutputDebugStrF("WALKED HEAP SIZE: %dk\n", heapSize / 1024);
//_CrtMemDumpStatistics(&memState);
#endif
}
@ -591,9 +584,7 @@ BOOL WINAPI DllMain(
HANDLE hDllHandle,
DWORD dwReason,
LPVOID lpreserved)
{
{
if (dwReason == DLL_PROCESS_ATTACH)
{
BpInit("127.0.0.1", "Beef IDE");
@ -638,13 +629,13 @@ namespace BeefyDbg64
static _CrtMemState gStartMemCheckpoint;
#endif
BF_EXPORT void BF_CALLTYPE Debugger_Create()
{
{
//TODO: Very slow, remove
//_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF);
//_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_EVERY_16_DF);
//TODO: _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF /*| _CRTDBG_CHECK_EVERY_16_DF*/);
//_CrtSetAllocHook(BfAllocHook);
#ifdef BF_PLATFORM_WINDOWS
_CrtMemCheckpoint(&gStartMemCheckpoint);
#endif
@ -661,7 +652,7 @@ BF_EXPORT void BF_CALLTYPE Debugger_Create()
gDebugManager->mDebugger64 = NULL;
#else
gDebugManager->mDebugger64 = CreateDebugger64(gDebugManager, NULL);
#endif
#endif
#ifdef BF_PLATFORM_WINDOWS
::AllowSetForegroundWindow(ASFW_ANY);
@ -672,12 +663,11 @@ BF_EXPORT void BF_CALLTYPE Debugger_Create()
BF_EXPORT void BF_CALLTYPE Debugger_SetCallbacks(void* callback)
{
}
BF_EXPORT void BF_CALLTYPE Debugger_FullReportMemory()
{
//WdAllocTest();
//WdAllocTest();
ShowMemoryUsage();
BfFullReportMemory();
}
@ -777,7 +767,7 @@ BF_EXPORT bool BF_CALLTYPE Debugger_OpenFile(const char* launchPath, const char*
Array<uint8> envBlock;
if (envBlockPtr != NULL)
{
{
if (envBlockSize != 0)
envBlock.Insert(0, (uint8*)envBlockPtr, envBlockSize);
}
@ -787,7 +777,7 @@ BF_EXPORT bool BF_CALLTYPE Debugger_OpenFile(const char* launchPath, const char*
}
BF_EXPORT bool BF_CALLTYPE Debugger_ComptimeAttach(void* bfCompiler)
{
{
gDebugger = new CeDebugger(gDebugManager, (BfCompiler*)bfCompiler);
return true;
}
@ -808,12 +798,12 @@ BF_EXPORT void BF_CALLTYPE Debugger_SetSymSrvOptions(const char* symCacheDir, co
if (!symStr.IsEmpty())
symServers.Add(symStr);
startStr = cPtr;
}
}
if (*cPtr == 0)
break;
}
AutoCrit autoCrit(gDebugManager->mCritSect);
gDebugManager->mSymSrvOptions.mCacheDir = symCacheDir;
@ -834,12 +824,11 @@ BF_EXPORT void BF_CALLTYPE Debugger_SetSymSrvOptions(const char* symCacheDir, co
}
gDebugManager->SetSourceServerCacheDir();
}
BF_EXPORT bool BF_CALLTYPE Debugger_OpenMiniDump(const char* fileName)
{
#ifdef BF_PLATFORM_WINDOWS
#ifdef BF_PLATFORM_WINDOWS
DbgMiniDump* dbgMiniDump = new DbgMiniDump();
bool result = dbgMiniDump->StartLoad(fileName);
if (!result)
@ -847,7 +836,6 @@ BF_EXPORT bool BF_CALLTYPE Debugger_OpenMiniDump(const char* fileName)
delete dbgMiniDump;
return false;
}
if (dbgMiniDump->GetTargetBitCount() == 32)
gDebugger = CreateDebugger32(gDebugManager, dbgMiniDump);
@ -875,7 +863,7 @@ BF_EXPORT bool BF_CALLTYPE Debugger_Attach(int processId, BfDbgAttachFlags attac
gDebugger = gDebugManager->mDebugger32;
return true;
}
return false;
}
@ -886,7 +874,7 @@ BF_EXPORT void BF_CALLTYPE Debugger_Run()
BF_EXPORT bool BF_CALLTYPE Debugger_HotLoad(const char* fileNamesStr, int hotIdx)
{
//DbgModule* dwarf = new DbgModule(gDebugger);
//DbgModule* dwarf = new DbgModule(gDebugger);
//dwarf->ReadPE(fileName);
Array<String> fileNames;
@ -919,8 +907,8 @@ BF_EXPORT bool BF_CALLTYPE Debugger_HotLoad(const char* fileNamesStr, int hotIdx
BF_EXPORT bool BF_CALLTYPE Debugger_LoadDebugVisualizers(const char* fileName)
{
String fn = fileName;
bool worked = false;
worked = gDebugManager->mDebugVisualizers->Load(fileName);
bool worked = false;
worked = gDebugManager->mDebugVisualizers->Load(fileName);
if (!gDebugManager->mDebugVisualizers->mErrorString.empty())
{
gDebugManager->mOutMessages.push_back(StrFormat("msg ERROR: %s\n", gDebugManager->mDebugVisualizers->mErrorString.c_str()));
@ -999,7 +987,7 @@ BF_EXPORT void BF_CALLTYPE Breakpoint_HotBindBreakpoint(Breakpoint* breakpoint,
BF_EXPORT void BF_CALLTYPE Breakpoint_SetThreadId(Breakpoint* breakpoint, intptr threadId)
{
BfLogDbg("Breakpoint %p set ThreadId=%d\n", breakpoint, threadId);
BfLogDbg("Breakpoint %p set ThreadId=%d\n", breakpoint, threadId);
breakpoint->mThreadId = threadId;
gDebugger->CheckBreakpoint(breakpoint);
}
@ -1064,19 +1052,19 @@ BF_EXPORT void BF_CALLTYPE Breakpoint_Disable(Breakpoint* wdBreakpoint)
BF_EXPORT void BF_CALLTYPE Debugger_CreateStepFilter(const char* filter, bool isGlobal, BfStepFilterKind filterKind)
{
AutoCrit autoCrit(gDebugManager->mCritSect);
AutoCrit autoCrit(gDebugManager->mCritSect);
StepFilter stepFilter;
stepFilter.mFilterKind = filterKind;
gDebugManager->mStepFilters[filter] = stepFilter;
gDebugManager->mStepFilterVersion++;
gDebugManager->mStepFilterVersion++;
}
BF_EXPORT void BF_CALLTYPE StepFilter_Delete(const char* filter)
{
AutoCrit autoCrit(gDebugManager->mCritSect);
AutoCrit autoCrit(gDebugManager->mCritSect);
bool didRemove = gDebugManager->mStepFilters.Remove(filter);
BF_ASSERT(didRemove);
gDebugManager->mStepFilterVersion++;
}
@ -1110,7 +1098,7 @@ BF_EXPORT const char* BF_CALLTYPE Debugger_PopMessage()
BF_EXPORT bool BF_CALLTYPE Debugger_HasMessages()
{
AutoCrit autoCrit(gDebugManager->mCritSect);
return gDebugManager->mOutMessages.size() != 0;
return gDebugManager->mOutMessages.size() != 0;
}
BF_EXPORT const char* BF_CALLTYPE Debugger_GetCurrentException()
@ -1177,7 +1165,7 @@ BF_EXPORT void BF_CALLTYPE Debugger_SetDisplayTypes(const char* referenceId, con
displayInfo = &gDebugManager->mDefaultDisplayInfo;
else
gDebugManager->mDisplayInfos.TryAdd(referenceId, NULL, &displayInfo);
if (formatStr != NULL)
displayInfo->mFormatStr = formatStr;
displayInfo->mIntDisplayType = (DwIntDisplayType)intDisplayType;
@ -1246,11 +1234,11 @@ BF_EXPORT const char* BF_CALLTYPE Debugger_EvaluateContinue()
BF_EXPORT void BF_CALLTYPE Debugger_EvaluateContinueKeep()
{
auto debugger = gDebugger;
debugger->EvaluateContinueKeep();
debugger->EvaluateContinueKeep();
}
BF_EXPORT StringView BF_CALLTYPE Debugger_Evaluate(const char* expr, int callStackIdx, int cursorPos, int32 language, uint16 expressionFlags)
{
{
auto debugger = gDebugger;
if (debugger == NULL)
@ -1291,39 +1279,37 @@ BF_EXPORT const char* BF_CALLTYPE Debugger_EvaluateAtAddress(const char* expr, i
BF_EXPORT const char* BF_CALLTYPE Debugger_GetAutoExpressions(int callStackIdx, uint64 memoryRangeStart, uint64 memoryRangeLen)
{
String& outString = *gTLStrReturn.Get();
String& outString = *gTLStrReturn.Get();
outString = gDebugger->GetAutoExpressions(callStackIdx, memoryRangeStart, memoryRangeLen);
return outString.c_str();
}
BF_EXPORT const char* BF_CALLTYPE Debugger_GetAutoLocals(int callStackIdx, bool showRegs)
{
String& outString = *gTLStrReturn.Get();
String& outString = *gTLStrReturn.Get();
outString = gDebugger->GetAutoLocals(callStackIdx, showRegs);
return outString.c_str();
}
BF_EXPORT const char* BF_CALLTYPE Debugger_CompactChildExpression(const char* expr, const char* parentExpr, int callStackIdx)
{
String& outString = *gTLStrReturn.Get();
String& outString = *gTLStrReturn.Get();
outString = gDebugger->CompactChildExpression(expr, parentExpr, callStackIdx);
return outString.c_str();
}
BF_EXPORT const char* BF_CALLTYPE Debugger_GetCollectionContinuation(const char* continuationData, int callStackIdx, int count)
{
String& outString = *gTLStrReturn.Get();
String& outString = *gTLStrReturn.Get();
outString = gDebugger->GetCollectionContinuation(continuationData, callStackIdx, count);
return outString.c_str();
}
BF_EXPORT void BF_CALLTYPE Debugger_ForegroundTarget()
{
gDebugger->ForegroundTarget();
//BOOL worked = EnumThreadWindows(gDebugger->mProcessInfo.dwThreadId, WdEnumWindowsProc, 0);
//BOOL worked = EnumThreadWindows(gDebugger->mProcessInfo.dwThreadId, WdEnumWindowsProc, 0);
//BF_ASSERT(worked);
}
@ -1394,7 +1380,7 @@ BF_EXPORT int BF_CALLTYPE CallStack_GetBreakStackFrameIdx()
BF_EXPORT const char* BF_CALLTYPE CallStack_GetStackFrameInfo(int stackFrameIdx, intptr* addr, const char** outFile, int32* outHotIdx, int32* outDefLineStart, int32* outDefLineEnd,
int32* outLine, int32* outColumn, int32* outLanguage, int32* outStackSize, int8* outFlags)
{
{
String& outString = *gTLStrReturn.Get();
String& outString2 = *gTLStrReturn2.Get();
@ -1413,7 +1399,7 @@ BF_EXPORT const char* BF_CALLTYPE CallStack_GetStackFrameId(int stackFrameIdx)
BF_EXPORT const char* BF_CALLTYPE Callstack_GetStackFrameOldFileInfo(int stackFrameIdx)
{
String& outString = *gTLStrReturn.Get();
outString = gDebugger->Callstack_GetStackFrameOldFileInfo(stackFrameIdx);
outString = gDebugger->Callstack_GetStackFrameOldFileInfo(stackFrameIdx);
return outString.c_str();
}
@ -1531,7 +1517,7 @@ BF_EXPORT int BF_CALLTYPE Debugger_LoadDebugInfoForModuleWith(const char* module
}
BF_EXPORT void BF_CALLTYPE Debugger_SetStepOverExternalFiles(bool stepOverExternalFiles)
{
{
gDebugManager->mStepOverExternalFiles = stepOverExternalFiles;
gDebugManager->mStepFilterVersion++;
}
@ -1552,7 +1538,7 @@ BF_EXPORT Profiler* BF_CALLTYPE Debugger_StartProfiling(intptr threadId, char* d
Profiler* profiler = gDebugger->StartProfiling();
profiler->mTargetThreadId = threadId;
if (desc != NULL)
profiler->mDescription = desc;
profiler->mDescription = desc;
profiler->mSamplesPerSecond = sampleRate;
profiler->Start();
return profiler;
@ -1560,7 +1546,7 @@ BF_EXPORT Profiler* BF_CALLTYPE Debugger_StartProfiling(intptr threadId, char* d
BF_EXPORT Profiler* BF_CALLTYPE Debugger_PopProfiler()
{
Profiler* profiler = gDebugger->PopProfiler();
Profiler* profiler = gDebugger->PopProfiler();
return profiler;
}
@ -1570,7 +1556,6 @@ BF_EXPORT void BF_CALLTYPE Debugger_InitiateHotResolve(int flags)
gDebugger->InitiateHotResolve((DbgHotResolveFlags)flags);
}
BF_EXPORT intptr BF_CALLTYPE Debugger_GetDbgAllocHeapSize()
{
AutoCrit autoCrit(gDebugManager->mCritSect);
@ -1580,7 +1565,7 @@ BF_EXPORT intptr BF_CALLTYPE Debugger_GetDbgAllocHeapSize()
BF_EXPORT const char* BF_CALLTYPE Debugger_GetDbgAllocInfo()
{
AutoCrit autoCrit(gDebugManager->mCritSect);
String& outString = *gTLStrReturn.Get();
outString = gDebugger->GetDbgAllocInfo();
return outString.c_str();
@ -1640,7 +1625,7 @@ BF_EXPORT NetResult* HTTP_GetFile(char* url, char* destPath)
{
AutoCrit autoCrit(gDebugManager->mNetManager->mThreadPool.mCritSect);
auto netResult = gDebugManager->mNetManager->QueueGet(url, destPath, false);
auto netResult = gDebugManager->mNetManager->QueueGet(url, destPath, false);
netResult->mDoneEvent = new SyncEvent();
return netResult;
}
@ -1674,7 +1659,7 @@ BF_EXPORT void HTTP_Delete(NetResult* netResult)
netResult->mCurRequest->Cancel();
}
netResult->mDoneEvent->WaitFor(-1);
}
}
delete netResult;
}
@ -1738,12 +1723,12 @@ BF_EXPORT void BF_CALLTYPE TimeTest(uint32 startTime)
}
BF_EXPORT void BF_CALLTYPE BFTest()
{
{
struct DeferredResolveEntry2
{
BfFieldDef* mFieldDef;
int mTypeArrayIdx;
};
};
DeferredResolveEntry2 entry = { NULL, 333 };
@ -1752,10 +1737,10 @@ BF_EXPORT void BF_CALLTYPE BFTest()
vec.push_back(DeferredResolveEntry2 { NULL, 222 } );
}
///
///
// __attribute__((weak))
// __attribute__((weak))
// Debugger* Beefy::CreateDebugger32(DebugManager* debugManager, DbgMiniDump* miniDump)
// {
// return NULL;
// }
// }

View file

@ -44,7 +44,7 @@ public:
StepFilter()
{
// Set global / local
mFilterKind = BfStepFilterKind_Filtered;
mFilterKind = BfStepFilterKind_Filtered;
}
bool IsFiltered(bool defaultValue)
@ -65,11 +65,11 @@ class DebugManager
{
public:
Debugger* mDebugger32;
Debugger* mDebugger64;
Debugger* mDebugger64;
CritSect mCritSect;
Dictionary<String, StepFilter> mStepFilters;
int mStepFilterVersion;
int mStepFilterVersion;
std::deque<String> mOutMessages;
DebugVisualizers* mDebugVisualizers;

View file

@ -5,7 +5,7 @@ USING_NS_BF;
void DebugVisualizers::Fail(const StringImpl& error)
{
if (mErrorString.length() != 0)
return;
return;
mErrorString = StrFormat("Debug visualizer failure: %s in %s", error.c_str(), mCurFileName.c_str());
}
@ -125,7 +125,7 @@ bool DebugVisualizers::ReadFileTOML(const StringImpl& fileName)
else if ((name == "DisplayString") | (name == "StringView"))
{
bool isStringView = name == "StringView";
if (value.is<toml::Array>())
{
for (auto& displayValue : ExpectArray(value))
@ -143,7 +143,7 @@ bool DebugVisualizers::ReadFileTOML(const StringImpl& fileName)
else
Fail("Unexpected entry", value);
}
if (isStringView)
entry->mStringViews.push_back(displayStringEntry);
else
@ -158,7 +158,7 @@ bool DebugVisualizers::ReadFileTOML(const StringImpl& fileName)
entry->mStringViews.push_back(displayStringEntry);
else
entry->mDisplayStrings.push_back(displayStringEntry);
}
}
}
else if (name == "Action")
{
@ -193,7 +193,7 @@ bool DebugVisualizers::ReadFileTOML(const StringImpl& fileName)
else if (name == "Condition")
expandItem->mCondition = ExpectString(value);
else
Fail("Unexpected entry", value);
Fail("Unexpected entry", value);
}
}
}
@ -234,7 +234,7 @@ bool DebugVisualizers::ReadFileTOML(const StringImpl& fileName)
else if (name == "LowerDimSizes")
{
for (auto& dimValue : ExpectArray(value))
entry->mLowerDimSizes.push_back(ExpectString(dimValue));
entry->mLowerDimSizes.push_back(ExpectString(dimValue));
}
else if (name == "ValueNode")
entry->mValuePointer = ExpectString(value);
@ -364,7 +364,7 @@ bool DebugVisualizers::Load(const StringImpl& fileNamesStr)
fileNames.Add(fileNamesStr.Substring(startIdx, crPos - startIdx));
startIdx = crPos + 1;
}
HashContext hashCtx;
for (auto fileName : fileNames)
{
@ -376,7 +376,7 @@ bool DebugVisualizers::Load(const StringImpl& fileNamesStr)
}
hashCtx.Mixin(lastWrite);
}
Val128 hash = hashCtx.Finish128();
if ((hash == mHash) && (!hasError))
return true;
@ -394,13 +394,12 @@ bool DebugVisualizers::Load(const StringImpl& fileNamesStr)
return success;
}
DebugVisualizerEntry* DebugVisualizers::FindEntryForType(const StringImpl& typeName, DbgFlavor wantFlavor, Array<String>* wildcardCaptures)
{
{
//TODO: Do smarter name matching. Right now we just compare up to the '*'
for (auto entry : mDebugVisualizers)
{
{
if ((entry->mFlavor != DbgFlavor_Unknown) && (entry->mFlavor != wantFlavor))
continue;
@ -435,7 +434,7 @@ DebugVisualizerEntry* DebugVisualizers::FindEntryForType(const StringImpl& typeN
int openDepth = 0;
String wildcardCapture;
while (true)
{
{
typeC = *typeCharP;
bool isSep = typeC == ',';
@ -459,7 +458,7 @@ DebugVisualizerEntry* DebugVisualizers::FindEntryForType(const StringImpl& typeN
{
typeCharP--;
break;
}
}
wildcardCapture += typeC;
typeCharP++;
@ -476,14 +475,14 @@ DebugVisualizerEntry* DebugVisualizers::FindEntryForType(const StringImpl& typeN
}
else if (entryC != typeC)
break;
typeCharP++;
entryCharP++;
}
if (wildcardCaptures != NULL)
wildcardCaptures->Clear();
}
wildcardCaptures->Clear();
}
return NULL;
}
@ -504,4 +503,4 @@ String DebugVisualizers::DoStringReplace(const StringImpl& origStr, const Array<
}
}
return newString;
}
}

View file

@ -48,7 +48,7 @@ public:
OwnedVector<ExpandItem> mExpandItems;
CollectionType mCollectionType;
String mSize;
Array<String> mLowerDimSizes;
String mNextPointer;
@ -58,11 +58,11 @@ public:
String mRightPointer;
String mValueType;
String mValuePointer;
String mTargetPointer;
String mTargetPointer;
String mCondition;
String mBuckets;
String mEntries;
String mKey;
String mKey;
bool mShowedError;
bool mShowElementAddrs;
@ -76,7 +76,7 @@ public:
mCollectionType = CollectionType_None;
mShowedError = false;
mShowElementAddrs = false;
}
}
};
class DebugVisualizers
@ -87,9 +87,9 @@ public:
String mCurFileName;
const char* mSrcStr;
OwnedVector<DebugVisualizerEntry> mDebugVisualizers;
void Fail(const StringImpl& error);
void Fail(const StringImpl& error, const toml::Value& value);
void Fail(const StringImpl& error, const toml::Value& value);
String ExpectString(const toml::Value& value);
bool ExpectBool(const toml::Value& value);

View file

@ -5,7 +5,7 @@
USING_NS_BF;
DbgModuleMemoryCache::DbgModuleMemoryCache(uintptr addr, int size)
{
{
mAddr = addr;
mSize = size;
@ -27,7 +27,7 @@ DbgModuleMemoryCache::DbgModuleMemoryCache(uintptr addr, int size)
// mBlocks = new uint8*[1];
// mFlags = new DbgMemoryFlags[1];
// mSize = size;
//
//
// if (makeCopy)
// {
// uint8* dataCopy = new uint8[size];
@ -40,8 +40,8 @@ DbgModuleMemoryCache::DbgModuleMemoryCache(uintptr addr, int size)
// else
// {
// mBlocks[0] = data;
// }
//
// }
//
// mOwns = makeCopy;
// mBlockCount = 1;
// }
@ -75,7 +75,7 @@ DbgMemoryFlags DbgModuleMemoryCache::Read(uintptr addr, uint8* data, int size)
int relAddr = (int)(addr - mAddr);
int blockIdx = relAddr / mBlockSize;
int curOffset = relAddr % mBlockSize;
while (sizeLeft > 0)
{
uint8* block = mBlocks[blockIdx];
@ -98,7 +98,7 @@ DbgMemoryFlags DbgModuleMemoryCache::Read(uintptr addr, uint8* data, int size)
}
sizeLeft -= readSize;
curOffset = 0;
blockIdx++;
blockIdx++;
}
return flags;
@ -114,4 +114,4 @@ void DbgModuleMemoryCache::ReportMemory(MemReporter * memReporter)
totalMemory += mBlockSize;
}
memReporter->Add(totalMemory);
}
}

View file

@ -29,7 +29,7 @@ public:
int mPendingHotBindIdx;
int mHitCount;
int mTargetHitCount;
DbgHitCountBreakKind mHitCountBreakKind;
DbgHitCountBreakKind mHitCountBreakKind;
String mLogging;
bool mBreakAfterLogging;
@ -40,7 +40,7 @@ public:
Breakpoint* mLinkedSibling; // For things like templates with multiple imps on same source line
bool mIsLinkedSibling; // Not in breakpoint list
public:
public:
Breakpoint()
{
mRequestedLineNum = -1;
@ -50,11 +50,11 @@ public:
mPendingHotBindIdx = -1;
mHitCount = 0;
mTargetHitCount = 0;
mHitCountBreakKind = DbgHitCountBreakKind_None;
mHitCountBreakKind = DbgHitCountBreakKind_None;
mThreadId = -1;
mHead = NULL;
mLinkedSibling = NULL;
mIsLinkedSibling = false;
mIsLinkedSibling = false;
mBreakAfterLogging = false;
}
@ -62,7 +62,6 @@ public:
virtual bool IsMemoryBreakpointBound() = 0;
};
enum DbgTypeKindFlags
{
DbgTypeKindFlag_None = 0,
@ -97,7 +96,7 @@ enum DwFloatDisplayType : int8
{
DwFloatDisplayType_Default,
DwFloatDisplayType_Minimal,
DwFloatDisplayType_Full,
DwFloatDisplayType_Full,
DwFloatDisplayType_HexUpper,
DwFloatDisplayType_HexLower,
@ -126,7 +125,7 @@ enum DwEvalExpressionFlags : int16
DwEvalExpressionFlag_MemoryAddress = 0x40,
DwEvalExpressionFlag_MemoryWatch = 0x80,
DwEvalExpressionFlag_Symbol = 0x100,
DwEvalExpressionFlag_StepIntoCalls = 0x200,
DwEvalExpressionFlag_StepIntoCalls = 0x200,
DwEvalExpressionFlag_RawStr = 0x400,
DwEvalExpressionFlag_AllowStringView = 0x800
};
@ -148,7 +147,7 @@ struct DwDisplayInfo
enum RunState
{
RunState_NotStarted,
RunState_NotStarted,
RunState_Running,
RunState_Running_ToTempBreakpoint,
RunState_Paused,
@ -158,7 +157,7 @@ enum RunState
RunState_HotStep,
RunState_Exception,
RunState_Terminating,
RunState_Terminated,
RunState_Terminated,
RunState_SearchingSymSrv,
RunState_HotResolve
};
@ -203,16 +202,15 @@ enum DbgMemoryFlags : uint8
class DbgModuleMemoryCache
{
public:
public:
public:
uintptr mAddr;
int mSize;
int mBlockSize;
uint8** mBlocks;
DbgMemoryFlags* mFlags;
int mBlockCount;
bool mOwns;
bool mOwns;
public:
DbgModuleMemoryCache(uintptr addr, int size);
@ -229,7 +227,7 @@ public:
struct TypeData
{
intptr mCount;
intptr mSize;
intptr mSize;
TypeData()
{
@ -249,7 +247,7 @@ class Debugger
{
public:
DebugManager* mDebugManager;
RunState mRunState;
RunState mRunState;
DbgHotResolveData* mHotResolveData;
bool mHadImageFindError;
@ -257,7 +255,7 @@ public:
Debugger()
{
mDebugManager = NULL;
mRunState = RunState_NotStarted;
mRunState = RunState_NotStarted;
mHotResolveData = NULL;
mHadImageFindError = false;
}
@ -283,7 +281,7 @@ public:
virtual Breakpoint* CreateAddressBreakpoint(intptr address) = 0;
virtual void CheckBreakpoint(Breakpoint* breakpoint) = 0;
virtual void HotBindBreakpoint(Breakpoint* wdBreakpoint, int lineNum, int hotIdx) = 0;
virtual void DeleteBreakpoint(Breakpoint* wdBreakpoint) = 0;
virtual void DeleteBreakpoint(Breakpoint* wdBreakpoint) = 0;
virtual void DetachBreakpoint(Breakpoint* wdBreakpoint) = 0;
virtual void MoveBreakpoint(Breakpoint* wdBreakpoint, int lineNum, int wantColumn, bool rebindNow) = 0;
virtual void MoveMemoryBreakpoint(Breakpoint* wdBreakpoint, intptr addr, int byteCount) = 0;
@ -306,13 +304,13 @@ public:
virtual void EvaluateContinueKeep() = 0;
virtual String EvaluateToAddress(const StringImpl& expr, int callStackIdx, int cursorPos) = 0;
virtual String EvaluateAtAddress(const StringImpl& expr, intptr atAddr, int cursorPos) = 0;
virtual String GetCollectionContinuation(const StringImpl& continuationData, int callStackIdx, int count) = 0;
virtual String GetCollectionContinuation(const StringImpl& continuationData, int callStackIdx, int count) = 0;
virtual String GetAutoExpressions(int callStackIdx, uint64 memoryRangeStart, uint64 memoryRangeLen) = 0;
virtual String GetAutoLocals(int callStackIdx, bool showRegs) = 0;
virtual String CompactChildExpression(const StringImpl& expr, const StringImpl& parentExpr, int callStackIdx) = 0;
virtual String GetProcessInfo() = 0;
virtual String GetThreadInfo() = 0;
virtual void SetActiveThread(int threadId) = 0;
virtual void SetActiveThread(int threadId) = 0;
virtual int GetActiveThread() = 0;
virtual void FreezeThread(int threadId) = 0;
virtual void ThawThread(int threadId) = 0;
@ -321,12 +319,12 @@ public:
virtual void UpdateCallStack(bool slowEarlyOut = true) = 0;
virtual int GetCallStackCount() = 0;
virtual int GetRequestedStackFrameIdx() = 0;
virtual int GetBreakStackFrameIdx() = 0;
virtual int GetBreakStackFrameIdx() = 0;
virtual bool ReadMemory(intptr address, uint64 length, void* dest, bool local = false) = 0;
virtual bool WriteMemory(intptr address, void* src, uint64 length) = 0;
virtual DbgMemoryFlags GetMemoryFlags(intptr address) = 0;
virtual void UpdateRegisterUsage(int stackFrameIdx) = 0;
virtual void UpdateCallStackMethod(int stackFrameIdx) = 0;
virtual void UpdateRegisterUsage(int stackFrameIdx) = 0;
virtual void UpdateCallStackMethod(int stackFrameIdx) = 0;
virtual void GetCodeAddrInfo(intptr addr, intptr inlineCallAddr, String* outFile, int* outHotIdx, int* outDefLineStart, int* outDefLineEnd, int* outLine, int* outColumn) = 0;
virtual void GetStackAllocInfo(intptr addr, int* outThreadId, int* outStackIdx) = 0;
virtual String GetStackFrameInfo(int stackFrameIdx, intptr* addr, String* outFile, int32* outHotIdx, int32* outDefLineStart, int32* outDefLineEnd, int32* outLine, int32* outColumn, int32* outLanguage, int32* outStackSize, int8* outFlags) = 0;
@ -340,8 +338,8 @@ public:
virtual String GetAddressSymbolName(intptr address, bool demangle) = 0;
virtual String DisassembleAtRaw(intptr address) = 0;
virtual String DisassembleAt(intptr address) = 0;
virtual String FindLineCallAddresses(intptr address) = 0;
virtual String GetCurrentException() = 0;
virtual String FindLineCallAddresses(intptr address) = 0;
virtual String GetCurrentException() = 0;
virtual String GetModulesInfo() = 0;
virtual void SetAliasPath(const StringImpl& origPath, const StringImpl& localPath) = 0;
virtual void CancelSymSrv() = 0;
@ -351,7 +349,7 @@ public:
virtual int LoadDebugInfoForModule(const StringImpl& moduleName, const StringImpl& debugFileName) = 0;
virtual void StopDebugging() = 0;
virtual void Terminate() = 0;
virtual void Detach() = 0;
virtual void Detach() = 0;
virtual Profiler* StartProfiling() = 0;
virtual Profiler* PopProfiler() = 0; // Profiler requested by target program
virtual void ReportMemory(MemReporter* memReporter) = 0;
@ -380,7 +378,7 @@ public:
virtual bool IsSampling() = 0;
virtual String GetOverview() = 0;
virtual String GetThreadList() = 0;
virtual String GetCallTree(int threadId, bool reverse) = 0;
virtual String GetCallTree(int threadId, bool reverse) = 0;
};
NS_BF_END

View file

@ -18,13 +18,13 @@
NS_BF_BEGIN
/// raw_null_ostream - A raw_ostream that discards all output.
class debug_ostream : public llvm::raw_ostream
class debug_ostream : public llvm::raw_ostream
{
/// write_impl - See raw_ostream::write_impl.
void write_impl(const char *Ptr, size_t size) override
{
StringT<1024> str;
str.Append(Ptr, size);
str.Append(Ptr, size);
OutputDebugStr(str);
}
@ -33,7 +33,7 @@ class debug_ostream : public llvm::raw_ostream
uint64_t current_pos() const override
{
return 0;
}
}
};
NS_BF_END

View file

@ -83,10 +83,10 @@ void NetRequest::Cleanup()
{
if (mCURLMulti != NULL)
curl_multi_remove_handle(mCURLMulti, mCURL);
if (mCURL != NULL)
curl_easy_cleanup(mCURL);
if (mCURLMulti != NULL)
curl_multi_cleanup(mCURLMulti);
if (mCURL != NULL)
curl_easy_cleanup(mCURL);
if (mCURLMulti != NULL)
curl_multi_cleanup(mCURLMulti);
mCURL = NULL;
mCURLMulti = NULL;
@ -160,7 +160,7 @@ void NetRequest::DoTransfer()
// mFailed = true;
// return;
// }
response_code = 0;
curl_easy_getinfo(mCURL, CURLINFO_RESPONSE_CODE, &response_code);
mNetManager->mDebugManager->OutputRawMessage(StrFormat("msgLo Result for '%s': %d\n", mURL.c_str(), response_code));
@ -199,20 +199,20 @@ void NetRequest::DoTransfer()
}
if (response_code != 200)
{
{
mOutFile.Close();
// Bad result
mFailed = true;
return;
}
BfLogDbg("NetManager successfully completed %s\n", mURL.c_str());
if (mCancelOnSuccess != NULL)
mNetManager->Cancel(mCancelOnSuccess);
if (!mOutFile.IsOpen())
{
{
mFailed = true;
return; // No data
}
@ -223,14 +223,14 @@ void NetRequest::DoTransfer()
BfpFile_Rename(mOutTempPath.c_str(), mOutPath.c_str(), &renameResult);
if (renameResult != BfpFileResult_Ok)
{
mFailed = true;
{
mFailed = true;
}
}
void NetRequest::Perform()
{
DoTransfer();
{
DoTransfer();
}
#elif defined BF_PLATFORM_WINDOWS
@ -263,16 +263,16 @@ void NetRequest::Perform()
Fail("Invalid URL");
return;
}
protoName = mURL.Substring(0, colonPos);
serverName = mURL.Substring(colonPos + 3);
int slashPos = (int)serverName.IndexOf('/');
if (slashPos != -1)
{
objectName = serverName.Substring(slashPos);
serverName.RemoveToEnd(slashPos);
}
}
mOutTempPath = mOutPath + "__partial";
@ -291,8 +291,8 @@ void NetRequest::Perform()
if (mOutFile.IsOpen())
mOutFile.Close();
};
};
bool isHttp = protoName.Equals("http", StringImpl::CompareKind_OrdinalIgnoreCase);
bool isHttps = protoName.Equals("https", StringImpl::CompareKind_OrdinalIgnoreCase);
if ((!isHttp) && (!isHttps))
@ -350,23 +350,23 @@ void NetRequest::Perform()
}
if (mShowTracking)
{
{
mNetManager->mDebugManager->OutputRawMessage(StrFormat("symsrv Getting '%s'", mURL.c_str()));
}
uint8 buffer[4096];
uint8 buffer[4096];
while (true)
{
DWORD dwBytesRead = 0;
BOOL bRead = InternetReadFile(hHttpFile, buffer, 4096, &dwBytesRead);
if (dwBytesRead == 0)
if (dwBytesRead == 0)
break;
if (!bRead)
if (!bRead)
{
//printf("InternetReadFile error : <%lu>\n", GetLastError());
Fail("Failed to receive");
return;
}
}
if (!mOutFile.IsOpen())
{
@ -378,7 +378,7 @@ void NetRequest::Perform()
}
}
mOutFile.Write(buffer, (int)dwBytesRead);
}
}
BfLogDbg("NetManager successfully completed %s\n", mURL.c_str());
@ -402,7 +402,6 @@ void NetRequest::Perform()
void NetRequest::Cleanup()
{
}
#else
@ -414,7 +413,6 @@ void NetRequest::Perform()
void NetRequest::Cleanup()
{
}
#endif
@ -437,7 +435,7 @@ NetRequest::~NetRequest()
delete mResult;
}
mNetManager->mRequestDoneEvent.Set();
mNetManager->mRequestDoneEvent.Set();
}
void NetRequest::Fail(const StringImpl& error)
@ -456,7 +454,7 @@ bool NetRequest::Cancel()
}
void NetRequest::ShowTracking()
{
{
//mNetManager->mDebugManager->OutputMessage(StrFormat("Getting '%s'\n", mURL.c_str()));
mNetManager->mDebugManager->OutputRawMessage(StrFormat("symsrv Getting '%s'", mURL.c_str()));
mShowTracking = true;
@ -464,7 +462,6 @@ void NetRequest::ShowTracking()
void NetManagerThread()
{
}
NetManager::NetManager() : mThreadPool(8, 1*1024*1024)
@ -480,13 +477,13 @@ NetManager::~NetManager()
for (auto kv : mCachedResults)
{
delete kv.mValue;
}
}
}
NetRequest* NetManager::CreateGetRequest(const StringImpl& url, const StringImpl& destPath, bool useCache)
{
AutoCrit autoCrit(mThreadPool.mCritSect);
NetRequest* netRequest = new NetRequest();
netRequest->mNetManager = this;
netRequest->mURL = url;
@ -520,7 +517,7 @@ NetRequest* NetManager::CreateGetRequest(const StringImpl& url, const StringImpl
NetResult* NetManager::QueueGet(const StringImpl& url, const StringImpl& destPath, bool useCache)
{
BfLogDbg("NetManager queueing %s %d\n", url.c_str(), useCache);
auto netRequest = CreateGetRequest(url, destPath, useCache);
auto netResult = netRequest->mResult;
mThreadPool.AddJob(netRequest);
@ -528,7 +525,7 @@ NetResult* NetManager::QueueGet(const StringImpl& url, const StringImpl& destPat
}
bool NetManager::Get(const StringImpl& url, const StringImpl& destPath)
{
{
NetRequest* netRequest = NULL;
int waitCount = 0;
while (true)
@ -539,7 +536,7 @@ bool NetManager::Get(const StringImpl& url, const StringImpl& destPath)
mWaitingResult = NULL;
NetResult* netResult;
if (mCachedResults.TryGetValue(url, &netResult))
if (mCachedResults.TryGetValue(url, &netResult))
{
if (netResult->mCurRequest == NULL)
{
@ -547,7 +544,7 @@ bool NetManager::Get(const StringImpl& url, const StringImpl& destPath)
return (!netResult->mFailed) && (FileExists(netResult->mOutPath));
}
else if (!netResult->mCurRequest->mShowTracking) // Is done?
{
{
if (!netResult->mCurRequest->mProcessing)
{
BfLogDbg("NetManager::Get pulling queued request into current thread %s\n", url.c_str());
@ -557,9 +554,9 @@ bool NetManager::Get(const StringImpl& url, const StringImpl& destPath)
break;
}
mWaitingResult = netResult;
mWaitingResult = netResult;
netResult->mCurRequest->ShowTracking();
}
}
}
else
{
@ -597,12 +594,12 @@ void NetManager::CancelAll()
AutoCrit autoCrit(mThreadPool.mCritSect);
if (mWaitingRequest != NULL)
mWaitingRequest->Cancel();
mThreadPool.CancelAll();
mThreadPool.CancelAll();
}
void NetManager::Clear()
{
AutoCrit autoCrit(mThreadPool.mCritSect);
AutoCrit autoCrit(mThreadPool.mCritSect);
BF_ASSERT(mWaitingResult == NULL); // The debugger thread shouldn't be waiting on anything, it should be detached at this point
for (auto job : mThreadPool.mJobs)
@ -649,7 +646,7 @@ void NetManager::SetCancelOnSuccess(NetResult* dependentResult, NetResult* cance
{
AutoCrit autoCrit(mThreadPool.mCritSect);
if (dependentResult->mCurRequest != NULL)
{
{
dependentResult->mCurRequest->mCancelOnSuccess = cancelOnSucess;
}
}
}

View file

@ -52,10 +52,10 @@ public:
#else
#endif
mCancelling = false;
mFailed = false;
mFailed = false;
mShowTracking = false;
mResult = NULL;
mCancelOnSuccess = NULL;
mCancelOnSuccess = NULL;
}
~NetRequest();
@ -63,7 +63,7 @@ public:
void Cleanup();
void Fail(const StringImpl& error);
bool Cancel() override;
bool Cancel() override;
void Perform() override;
void ShowTracking();
};
@ -113,7 +113,7 @@ public:
NetRequest* CreateGetRequest(const StringImpl& url, const StringImpl& destPath, bool useCache);
NetResult* QueueGet(const StringImpl& url, const StringImpl& destPath, bool useCache);
bool Get(const StringImpl& url, const StringImpl& destPath);
void CancelAll();
void Clear();
void CancelCurrent();

View file

@ -26,9 +26,9 @@ BF_EXPORT SpellChecker* BF_CALLTYPE SpellChecker_Create(const char* langPath)
return NULL;
}
SpellChecker* spellChecker = new SpellChecker();
SpellChecker* spellChecker = new SpellChecker();
spellChecker->mHunHandle = hunHandle;
return spellChecker;
}

View file

@ -13,7 +13,7 @@ public:
Beefy::BumpAllocator mAlloc;
struct Entry
{
{
T mValue;
Entry* mNext;
};
@ -30,7 +30,7 @@ public:
{
mMap = map;
mCurBucket = 0;
mCurEntry = NULL;
mCurEntry = NULL;
}
Iterator& operator++()
@ -67,7 +67,7 @@ public:
public:
int GetHash(const char* str, const char* strEnd)
{
{
if (str == NULL)
return 0;
@ -83,20 +83,20 @@ public:
return curHash & 0x7FFFFFFF;
}
public:
public:
Entry** mHashHeads;
public:
StrBloomMap()
{
mHashHeads = NULL;
mHashHeads = NULL;
}
void InsertUnique(int hash, T value)
{
if (mHashHeads == NULL)
mHashHeads = (Entry**)mAlloc.AllocBytes(sizeof(Entry*) * HashSize, alignof(Entry*));
int hashIdx = hash % HashSize;
Entry* headEntry = mHashHeads[hashIdx];
@ -116,12 +116,12 @@ public:
}
Entry* FindFirst(const char* name)
{
{
if (mHashHeads == NULL)
return NULL;
int hash = GetHash(name, NULL) % HashSize;
return mHashHeads[hash];
return mHashHeads[hash];
}
Iterator begin()
@ -138,4 +138,3 @@ public:
};
NS_BF_DBG_END

View file

@ -8,10 +8,10 @@ NS_BF_DBG_BEGIN
template <typename T>
class StrHashMap
{
public:
public:
struct Entry
{
T mValue;
T mValue;
Entry* mNext;
int mHash;
};
@ -102,7 +102,7 @@ public:
public:
Beefy::BumpAllocator mAlloc;
Entry** mHashHeads;
int mHashSize;
int mHashSize;
int mCount;
public:
@ -140,7 +140,7 @@ public:
Entry* checkEntry = mHashHeads[hashIdx];
while (checkEntry != NULL)
{
auto nextEntry = checkEntry->mNext;
auto nextEntry = checkEntry->mNext;
int newHashIdx = checkEntry->mHash % newHashSize;
checkEntry->mNext = newHashHeads[newHashIdx];
newHashHeads[newHashIdx] = checkEntry;
@ -197,5 +197,4 @@ public:
}
};
NS_BF_DBG_END

View file

@ -56,7 +56,7 @@
struct Find_Result {
int windows_sdk_version = 0; // Zero if no Windows SDK found.
wchar_t *windows_sdk_root = NULL;
wchar_t *windows_sdk_root = NULL;
wchar_t* vs_version = NULL;
wchar_t *vs_exe32_path = NULL;
@ -68,7 +68,7 @@ struct Find_Result {
Find_Result find_visual_studio_and_windows_sdk();
void free_resources(Find_Result *result) {
free(result->windows_sdk_root);
free(result->windows_sdk_root);
free(result->vs_version);
free(result->vs_exe32_path);
free(result->vs_exe64_path);
@ -95,10 +95,10 @@ void free_resources(Find_Result *result) {
// I am not making this up: https://github.com/Microsoft/vswhere
//
// Several people have therefore found the need to solve this problem
// themselves. We referred to some of these other solutions when
// themselves. We referred to some of these other solutions when
// figuring out what to do, most prominently ziglang's version,
// by Ryan Saunderson.
//
//
// I hate this kind of code. The fact that we have to do this at all
// is stupid, and the actual maneuvers we need to go through
// are just painful. If programming were like this all the time,
@ -148,7 +148,6 @@ public:
#define defer const auto& CONCAT(defer__, __LINE__) = ExitScopeHelp() + [&]()
// COM objects for the ridiculous Microsoft craziness.
struct DECLSPEC_UUID("B41463C3-8866-43B5-BC33-2B0676F7F42E") DECLSPEC_NOVTABLE ISetupInstance : public IUnknown
@ -178,7 +177,6 @@ struct DECLSPEC_UUID("42843719-DB4C-46C2-8E7C-64F1816EFD5B") DECLSPEC_NOVTABLE I
STDMETHOD(GetInstanceForPath)(_In_z_ LPCWSTR wzPath, _Out_ ISetupInstance** ppInstance) = 0;
};
// The beginning of the actual code that does things.
struct Version_Data {
@ -224,7 +222,6 @@ wchar_t *concat(wchar_t *a, wchar_t *b, wchar_t *c = nullptr, wchar_t *d = nullp
typedef void(*Visit_Proc_W)(wchar_t *short_name, wchar_t *full_name, Version_Data *data);
bool visit_files_w(wchar_t *dir_name, Version_Data *data, Visit_Proc_W proc) {
// Visit everything in one folder (non-recursively). If it's a directory
// that doesn't start with ".", call the visit proc on it. The visit proc
// will see if the filename conforms to the expected versioning pattern.
@ -253,7 +250,6 @@ bool visit_files_w(wchar_t *dir_name, Version_Data *data, Visit_Proc_W proc) {
return true;
}
wchar_t *find_windows_kit_root(HKEY key, wchar_t *version) {
// Given a key to an already opened registry entry,
// get the value stored under the 'version' subkey.
@ -340,7 +336,7 @@ void find_windows_kit_root(Find_Result *result) {
// is stored in the same place in the registry. We open a key
// to that place, first checking preferentially for a Windows 10 kit,
// then, if that's not found, a Windows 8 kit.
HKEY main_key;
auto rc = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots",
@ -386,7 +382,6 @@ void find_windows_kit_root(Find_Result *result) {
// If we get here, we failed to find anything.
}
void find_visual_studio_by_fighting_through_microsoft_craziness(Find_Result *result) {
// The name of this procedure is kind of cryptic. Its purpose is
// to fight through Microsoft craziness. The things that the fine
@ -449,7 +444,7 @@ void find_visual_studio_by_fighting_through_microsoft_craziness(Find_Result *res
if (!success) continue;
auto version_bytes = (tools_file_size.QuadPart + 1) * 2; // Warning: This multiplication by 2 presumes there is no variable-length encoding in the wchars (wacky characters in the file could betray this expectation).
wchar_t *version = (wchar_t *)malloc(version_bytes);
wchar_t *version = (wchar_t *)malloc(version_bytes);
auto read_result = fgetws(version, (int)version_bytes, f);
if (!read_result) continue;
@ -465,15 +460,15 @@ void find_visual_studio_by_fighting_through_microsoft_craziness(Find_Result *res
bool use = false;
if ((os_file_exists(library_file)) && (os_file_exists(vs_exe64_link_path)))
{
{
if (result->vs_version == NULL)
{
use = true;
}
}
else if (wcscmp(version, result->vs_version) > 0)
{
use = true;
}
}
}
if (use)
@ -492,7 +487,7 @@ void find_visual_studio_by_fighting_through_microsoft_craziness(Find_Result *res
free(library32_path);
free(library64_path);
}
free(library_file);
free(vs_exe64_link_path);
@ -562,7 +557,6 @@ void find_visual_studio_by_fighting_through_microsoft_craziness(Find_Result *res
// If we get here, we failed to find anything.
}
Find_Result find_visual_studio_and_windows_sdk() {
Find_Result result;
@ -582,7 +576,7 @@ BF_EXPORT const char* BF_CALLTYPE VSSupport_Find()
{
Beefy::String& outString = *Beefy::gTLStrReturn.Get();
outString.clear();
Find_Result findResult = find_visual_studio_and_windows_sdk();
auto _AddPath = [&](wchar_t* str)
@ -593,11 +587,11 @@ BF_EXPORT const char* BF_CALLTYPE VSSupport_Find()
outString += Beefy::UTF8Encode(str);
}
};
if (findResult.vs_exe32_path != NULL)
outString += "TOOL32\t" + Beefy::UTF8Encode(findResult.vs_exe32_path) + "\n";
if (findResult.vs_exe64_path != NULL)
outString += "TOOL64\t" + Beefy::UTF8Encode(findResult.vs_exe64_path) + "\n";
outString += "TOOL64\t" + Beefy::UTF8Encode(findResult.vs_exe64_path) + "\n";
if (findResult.windows_sdk_root != NULL)
{
@ -630,7 +624,7 @@ BF_EXPORT const char* BF_CALLTYPE VSSupport_Find()
outString += Beefy::UTF8Encode(findResult.vs_library64_path);
outString += "\n";
}
free_resources(&findResult);
return outString.c_str();

View file

@ -54,7 +54,7 @@ const char* X64CPURegisters::sCPURegisterNames[] =
"NONE",
// integer general registers (DO NOT REORDER THESE; must exactly match DbgModule x86 register mappings)
"RAX",
"RAX",
"RDX",
"RCX",
"RBX",
@ -69,7 +69,7 @@ const char* X64CPURegisters::sCPURegisterNames[] =
"R12",
"R13",
"R14",
"R15",
"R15",
"RIP",
"EFL",
"GS",
@ -88,7 +88,7 @@ const char* X64CPURegisters::sCPURegisterNames[] =
"R13D",
"R14D",
"R15D",
"AX",
"DX",
"CX",
@ -141,7 +141,7 @@ const char* X64CPURegisters::sCPURegisterNames[] =
"MM4",
"MM5",
"MM6",
"MM7",
"MM7",
"XMM0_f64",
"XMM1_f64",
@ -354,7 +354,7 @@ bool X64Instr::IsRep(bool& isPrefixOnly)
bool X64Instr::IsReturn()
{
const MCInstrDesc &instDesc = mX64->mInstrInfo->get(mMCInst.getOpcode());
const MCInstrDesc &instDesc = mX64->mInstrInfo->get(mMCInst.getOpcode());
return (instDesc.getFlags() & (1 << MCID::Return)) != 0;
}
@ -402,7 +402,7 @@ static int ConvertRegNum(const MCOperand& operand)
return X64Reg_RBP;
case llvm::X86::RSP:
return X64Reg_RSP;
case llvm::X86::R8:
case llvm::X86::R8D:
case llvm::X86::R8W:
@ -507,7 +507,7 @@ static int ConvertRegNum(const MCOperand& operand)
case llvm::X86::XMM14:
return X64Reg_M128_XMM14;
case llvm::X86::XMM15:
return X64Reg_M128_XMM15;
return X64Reg_M128_XMM15;
}
return -1;
@ -573,13 +573,13 @@ bool X64Instr::GetImmediate(uint64* outImm)
int X64Instr::GetJmpState(int flags)
{
const MCInstrDesc &instDesc = mX64->mInstrInfo->get(mMCInst.getOpcode());
const MCInstrDesc &instDesc = mX64->mInstrInfo->get(mMCInst.getOpcode());
if ((instDesc.getFlags() & (1 << MCID::Branch)) == 0)
return -1;
if (mMCInst.getNumOperands() < 1)
return 0;
#define FLAGVAR(abbr, name) int flag##abbr = ((flags & ((uint64)1 << X64CPURegisters::GetFlagBitForRegister(X64Reg_FLAG_##abbr##_##name))) != 0) ? 1 : 0
FLAGVAR(CF, CARRY);
FLAGVAR(PF, PARITY);
@ -641,10 +641,10 @@ void X64Instr::MarkRegsUsed(Array<RegForm>& regsUsed, bool overrideForm)
int opCode = instDesc.getOpcode();
auto form = (instDesc.TSFlags & llvm::X86II::FormMask);
/*if (opCode == 1724)
/*if (opCode == 1724)
{
// MOVAPSrr is emitted for all moves between XMM registers, regardless of
// MOVAPSrr is emitted for all moves between XMM registers, regardless of
// their actual format, so we just copy the actual RegForm form here
if (instDesc.getNumOperands() != 2)
return;
@ -655,7 +655,7 @@ void X64Instr::MarkRegsUsed(Array<RegForm>& regsUsed, bool overrideForm)
int regNumFrom = ConvertRegNum(operand);
if (regNumFrom == -1) // ??
return;
return;
while (std::max(regNumFrom, regNumTo) >= (int)regsUsed.size())
regsUsed.push_back(RegForm_Invalid);
@ -680,7 +680,7 @@ void X64Instr::MarkRegsUsed(Array<RegForm>& regsUsed, bool overrideForm)
int checkIdx = opCode * 3;
//const MCInstrDesc &instDesc = mX64->mInstrInfo->get(mMCInst.getOpcode());
//auto form = (instDesc.TSFlags & llvm::X86II::FormMask);
//auto form = (instDesc.TSFlags & llvm::X86II::FormMask);
for (int opIdx = 0; opIdx < std::min((int)instDesc.getNumOperands(), 3); opIdx++)
{
@ -696,7 +696,7 @@ void X64Instr::MarkRegsUsed(Array<RegForm>& regsUsed, bool overrideForm)
regsUsed[regNum] = regForm;
checkIdx++;
}
}
}
}
@ -733,7 +733,7 @@ uint64 X64Instr::GetTarget(Debugger* debugger, X64CPURegisters* registers)
if (operand.isImm())
{
auto targetAddr = (uint64)operand.getImm();
auto targetAddr = (uint64)operand.getImm();
if (instDesc.OpInfo[opIdx].OperandType == MCOI::OPERAND_PCREL)
targetAddr += mAddress + mSize;
return targetAddr;
@ -756,10 +756,10 @@ bool X64Instr::PartialSimulate(Debugger* debugger, X64CPURegisters* registers)
// auto form = (instDesc.TSFlags & llvm::X86II::FormMask);
//
// if ((form == llvm::X86II::MRMSrcMem) && (instDesc.NumOperands == 6))
// {
// {
// auto destReg = mMCInst.getOperand(llvm::X86::AddrBaseReg);
// if (destReg.isReg())
// {
// {
// int regNum = 0;
// int offset = 0;
// if (GetIndexRegisterAndOffset(&regNum, &offset))
@ -767,7 +767,7 @@ bool X64Instr::PartialSimulate(Debugger* debugger, X64CPURegisters* registers)
// uint64 addr = registers->mIntRegsArray[regNum] + offset;
// uint64 val = 0;
// debugger->ReadMemory(addr, 8, &val);
//
//
// switch (destReg.getReg())
// {
//
@ -779,7 +779,7 @@ bool X64Instr::PartialSimulate(Debugger* debugger, X64CPURegisters* registers)
//// if ((form == llvm::X86II::MRMDestMem) || (form == llvm::X86II::MRMSrcMem) ||
//// ((form >= llvm::X86II::MRM0m) && (form <= llvm::X86II::MRM7m)))
//// {
//// }
//// }
// }
//
// if (instDesc.getOpcode() == X86::XOR8rr)
@ -792,7 +792,7 @@ bool X64Instr::PartialSimulate(Debugger* debugger, X64CPURegisters* registers)
// if ((destReg.isReg()) && (srcReg.isReg()))
// {
// if (destReg.getReg() == srcReg.getReg())
// {
// {
// switch (destReg.getReg())
// {
// case X86::AL:
@ -817,8 +817,8 @@ X64CPU::X64CPU() :
mInstrInfo = NULL;
mInstPrinter = NULL;
//InitializeAllTargets();
//InitializeAllTargets();
auto& TheX86_64Target = llvm::getTheX86_64Target();
const char* triple = "x86_64-pc-mingw32";
@ -835,7 +835,7 @@ X64CPU::X64CPU() :
return;
mInstrInfo = TheX86_64Target.createMCInstrInfo();
mMCContext = new MCContext(Triple(triple), mAsmInfo, mRegisterInfo, mSubtargetInfo);
mMCObjectFileInfo = TheX86_64Target.createMCObjectFileInfo(*mMCContext, false);
@ -875,11 +875,11 @@ X64CPU::~X64CPU()
}
bool X64CPU::Decode(uint64 address, DbgModuleMemoryCache* memoryCache, X64Instr* inst)
{
{
inst->mAddress = address;
inst->mX64 = this;
uint64 size = 0;
uint64 size = 0;
uint8 data[15];
memoryCache->Read(address, data, 15);
@ -939,7 +939,6 @@ void X64CPU::GetNextPC(uint64 baseAddress, const uint8* dataBase, int dataLength
mDisAsm->CommentStream = &nulls();
ArrayRef<uint8_t> dataArrayRef(dataPtr, dataLength - (dataPtr - dataBase));
MCDisassembler::DecodeStatus S = mDisAsm->getInstruction(mcInst, size, dataArrayRef, address, nulls());
}
bool X64CPU::IsReturnInstruction(X64Instr* inst)
@ -957,7 +956,7 @@ String X64CPU::InstructionToString(X64Instr* inst, uint64 addr)
//mInstPrinter->CurPCRelImmOffset = addr + inst->GetLength();
mInstPrinter->printInst(&inst->mMCInst, addr, annotationsStr, *mSubtargetInfo, OS);
//OS.flush();
//llvm::StringRef str = OS.str();
//llvm::StringRef str = OS.str();
String result;
for (int idx = 0; idx < (int)insnStr.size(); idx++)
@ -991,21 +990,21 @@ String X64CPU::InstructionToString(X64Instr* inst, uint64 addr)
}
DbgBreakKind X64CPU::GetDbgBreakKind(uint64 address, DbgModuleMemoryCache* memoryCache, int64* regs, int64* outObjectPtr)
{
{
// We've looking for a CMP BYTE PTR [<reg>], -0x80
// if <reg> is R12 then encoding takes an extra 2 bytes
X64Instr inst;
X64Instr inst;
for (int checkLen = 5; checkLen >= 3; checkLen--)
{
{
int offset = -3 - checkLen;
if (!Decode(address + offset, memoryCache, &inst))
continue;
continue;
if (inst.GetLength() != checkLen)
continue;
const MCInstrDesc &instDesc = mInstrInfo->get(inst.mMCInst.getOpcode());
const MCInstrDesc &instDesc = mInstrInfo->get(inst.mMCInst.getOpcode());
if (!instDesc.isCompare())
continue;
@ -1052,18 +1051,18 @@ DbgBreakKind X64CPU::GetDbgBreakKind(uint64 address, DbgModuleMemoryCache* memor
for (int offset = 3; offset <= 3; offset++)
{
if (!Decode(address - offset, memoryCache, &inst))
continue;
continue;
if (inst.GetLength() != 2)
continue;
const MCInstrDesc &instDesc = mInstrInfo->get(inst.mMCInst.getOpcode());
const MCInstrDesc &instDesc = mInstrInfo->get(inst.mMCInst.getOpcode());
if (!instDesc.isBranch())
continue;
auto immediateType = (instDesc.TSFlags & llvm::X86II::ImmMask);
if ((immediateType == llvm::X86II::Imm8PCRel) && (inst.mMCInst.getNumOperands() == 2))
{
{
auto immOp = inst.mMCInst.getOperand(1);
if (!immOp.isImm())
continue;
@ -1181,4 +1180,4 @@ bool X64CPU::ParseInlineAsmInstructionLLVM(const StringImpl&asmInst, String& out
//outError = StrFormat("%s: \"%s\"", diagMessage.c_str(), diagLineContents.c_str());
return result;
}
}

View file

@ -36,7 +36,7 @@ enum X64CPURegister
X64Reg_None = -1,
// integer general registers (DO NOT REORDER THESE; must exactly match DbgModule X64 register mappings)
X64Reg_RAX = 0,
X64Reg_RAX = 0,
X64Reg_RDX,
X64Reg_RCX,
X64Reg_RBX,
@ -51,7 +51,7 @@ enum X64CPURegister
X64Reg_R12,
X64Reg_R13,
X64Reg_R14,
X64Reg_R15,
X64Reg_R15,
X64Reg_RIP,
X64Reg_EFL,
X64Reg_GS,
@ -74,7 +74,7 @@ enum X64CPURegister
X64Reg_AX,
X64Reg_DX,
X64Reg_CX,
X64Reg_BX,
X64Reg_BX,
X64Reg_SI,
X64Reg_DI,
X64Reg_R8W,
@ -93,7 +93,7 @@ enum X64CPURegister
X64Reg_AH,
X64Reg_DH,
X64Reg_CH,
X64Reg_BH,
X64Reg_BH,
X64Reg_SIL,
X64Reg_DIL,
X64Reg_R8B,
@ -159,7 +159,7 @@ enum X64CPURegister
X64Reg_XMM12_f32,
X64Reg_XMM13_f32,
X64Reg_XMM14_f32,
X64Reg_XMM15_f32,
X64Reg_XMM15_f32,
// xmm registers
X64Reg_XMM00,
@ -298,14 +298,14 @@ public:
struct IntRegs
{
int64 rax;
int64 rax;
int64 rdx;
int64 rcx;
int64 rbx;
int64 rbx;
int64 rsi;
int64 rdi;
uint64 rbp;
uint64 rsp;
uint64 rsp;
int64 r8;
int64 r9;
int64 r10;
@ -395,7 +395,7 @@ public:
X64Reg_RSP,
X64Reg_RBP,
X64Reg_RSI,
X64Reg_RDI,
X64Reg_RDI,
X64Reg_R8,
X64Reg_R9,
X64Reg_R10,
@ -466,7 +466,7 @@ public:
bool IsCall();
bool IsRep(bool& isPrefixOnly);
bool IsReturn();
bool IsLoadAddress();
bool IsLoadAddress();
bool GetIndexRegisterAndOffset(int* outRegister, int* outOffset); // IE: [ebp + 0x4]
bool GetImmediate(uint64* outImm);
int GetJmpState(int flags);
@ -476,7 +476,6 @@ public:
bool PartialSimulate(Debugger* debugger, X64CPURegisters* registers);
};
class X64CPU
{
public:

View file

@ -159,10 +159,10 @@ bool X86Instr::StackAdjust(uint32& adjust)
if (mMCInst.getOpcode() != X86::SUB32ri8)
return true;
auto operand0 = mMCInst.getOperand(0);
if (operand0.getReg() != llvm::X86::ESP)
return true;
return true;
auto operand2 = mMCInst.getOperand(2);
if (!operand2.isImm())
return false;
@ -191,7 +191,7 @@ bool X86Instr::IsReturn()
}
bool X86Instr::IsRep(bool& isPrefixOnly)
{
{
auto instFlags = mMCInst.getFlags();
if ((instFlags & (X86::IP_HAS_REPEAT_NE | X86::IP_HAS_REPEAT)) != 0)
{
@ -208,7 +208,7 @@ bool X86Instr::IsRep(bool& isPrefixOnly)
}
bool X86Instr::IsLoadAddress()
{
{
const MCInstrDesc &instDesc = mX86->mInstrInfo->get(mMCInst.getOpcode());
if (instDesc.NumOperands >= 6)
{
@ -234,25 +234,25 @@ static int ConvertRegNum(const MCOperand& operand)
case llvm::X86::CL:
case llvm::X86::CH:
case llvm::X86::ECX:
return X86Reg_ECX;
return X86Reg_ECX;
case llvm::X86::DL:
case llvm::X86::DH:
case llvm::X86::EDX:
return X86Reg_EDX;
return X86Reg_EDX;
case llvm::X86::BL:
case llvm::X86::BH:
case llvm::X86::EBX:
return X86Reg_EBX;
return X86Reg_EBX;
case llvm::X86::ESP:
return X86Reg_ESP;
return X86Reg_ESP;
case llvm::X86::EBP:
return X86Reg_EBP;
return X86Reg_EBP;
case llvm::X86::ESI:
return X86Reg_ESI;
return X86Reg_ESI;
case llvm::X86::EDI:
return X86Reg_EDI;
return X86Reg_EDI;
case llvm::X86::EIP:
return X86Reg_EIP;
return X86Reg_EIP;
case llvm::X86::EFLAGS:
return X86Reg_EFL;
@ -272,7 +272,7 @@ static int ConvertRegNum(const MCOperand& operand)
return X86Reg_FPST6;
case llvm::X86::ST7:
return X86Reg_FPST7;
case llvm::X86::XMM0:
return X86Reg_M128_XMM0;
case llvm::X86::XMM1:
@ -299,9 +299,9 @@ bool X86Instr::GetIndexRegisterAndOffset(int* outRegister, int* outOffset)
const MCInstrDesc &instDesc = mX86->mInstrInfo->get(mMCInst.getOpcode());
auto form = (instDesc.TSFlags & llvm::X86II::FormMask);
if ((form == llvm::X86II::MRMDestMem) || (form == llvm::X86II::MRMSrcMem) ||
if ((form == llvm::X86II::MRMDestMem) || (form == llvm::X86II::MRMSrcMem) ||
((form >= llvm::X86II::MRM0m) && (form <= llvm::X86II::MRM7m)))
{
{
auto baseReg = mMCInst.getOperand(llvm::X86::AddrBaseReg);
auto scaleAmt = mMCInst.getOperand(llvm::X86::AddrScaleAmt);
auto indexReg = mMCInst.getOperand(llvm::X86::AddrIndexReg);
@ -320,12 +320,12 @@ bool X86Instr::GetIndexRegisterAndOffset(int* outRegister, int* outOffset)
if ((baseReg.isReg()) &&
(scaleAmt.isImm()) && (scaleAmt.getImm() == 1) &&
(indexReg.isReg()) && (indexReg.getReg() == llvm::X86::NoRegister) &&
(addrDisp.isImm()))
(addrDisp.isImm()))
{
int regNum = ConvertRegNum(baseReg);
if (regNum == -1)
return false;
*outRegister = regNum;
*outRegister = regNum;
*outOffset = (int)addrDisp.getImm();
return true;
}
@ -336,11 +336,11 @@ bool X86Instr::GetIndexRegisterAndOffset(int* outRegister, int* outOffset)
bool X86Instr::GetImmediate(uint32* outImm)
{
const MCInstrDesc &instDesc = mX86->mInstrInfo->get(mMCInst.getOpcode());
auto immediateType = (instDesc.TSFlags & llvm::X86II::ImmMask);
if ((immediateType == 0) && (mMCInst.getNumOperands() < 6))
return false;
auto immOp = mMCInst.getOperand(5);
if (!immOp.isImm())
return false;
@ -376,9 +376,9 @@ void X86Instr::MarkRegsUsed(Array<RegForm>& regsUsed, bool overrideForm)
}
uint32 X86Instr::GetTarget(Debugger* debugger, X86CPURegisters* registers)
{
{
const MCInstrDesc &instDesc = mX86->mInstrInfo->get(mMCInst.getOpcode());
if (mMCInst.getNumOperands() < 1)
return 0;
@ -389,7 +389,7 @@ uint32 X86Instr::GetTarget(Debugger* debugger, X86CPURegisters* registers)
opIdx = 4;
operand = mMCInst.getOperand(opIdx);
}
if (operand.isImm())
{
auto targetAddr = (uint32)operand.getImm();
@ -418,7 +418,7 @@ X86CPU::X86CPU() :
mInstrInfo = NULL;
mInstPrinter = NULL;
//InitializeAllTargets();
//InitializeAllTargets();
auto& TheX86_32Target = getTheX86_32Target();
@ -438,7 +438,7 @@ X86CPU::X86CPU() :
//TargetOptions targetOptions;
//TargetMachine* targetMachine = TheX86_32Target.createTargetMachine(triple, "x86", "", targetOptions);
//const MCInstrInfo* MII = targetMachine->getSubtargetImpl()->getInstrInfo();
//const MCInstrInfo* MII = targetMachine->getSubtargetImpl()->getInstrInfo();
//STI->getIntr
mInstrInfo = TheX86_32Target.createMCInstrInfo();
@ -452,11 +452,11 @@ X86CPU::X86CPU() :
mMCContext->setObjectFileInfo(mMCObjectFileInfo);
MCDisassembler *disAsm = TheX86_32Target.createMCDisassembler(*mSubtargetInfo, *mMCContext);
mDisAsm = disAsm;
mDisAsm = disAsm;
//TODO: LLVM3.8 - changed params
/*mInstPrinter = TheX86_32Target.createMCInstPrinter(1, *mAsmInfo,
*mInstrInfo, *mRegisterInfo, *mSubtargetInfo);*/
*mInstrInfo, *mRegisterInfo, *mSubtargetInfo);*/
mInstPrinter = TheX86_32Target.createMCInstPrinter(Triple(triple), 1, *mAsmInfo,
*mInstrInfo, *mRegisterInfo);
@ -471,7 +471,7 @@ X86CPU::X86CPU() :
extern "C" void LLVMShutdown();
X86CPU::~X86CPU()
{
{
delete mInstPrinter;
delete mDisAsm;
delete mMCContext;
@ -485,11 +485,11 @@ X86CPU::~X86CPU()
}
bool X86CPU::Decode(uint32 address, DbgModuleMemoryCache* memoryCache, X86Instr* inst)
{
{
inst->mAddress = address;
inst->mX86 = this;
uint64 size = 0;
uint64 size = 0;
uint8 data[15];
memoryCache->Read(address, data, 15);
@ -504,15 +504,15 @@ bool X86CPU::Decode(uint32 address, DbgModuleMemoryCache* memoryCache, X86Instr*
bool X86CPU::Decode(uint32 baseAddress, const uint8* dataBase, int dataLength, const uint8* dataPtr, X86Instr* inst)
{
//X86GenericDisassembler assembler;
//DisasmMemoryObject region((uint8*)dataBase, dataLength, baseAddress);
//std::memorystream
uint32 address = baseAddress + (uint32)(dataPtr - dataBase);
inst->mAddress = address;
inst->mX86 = this;
uint64 size = 0;
uint64 size = 0;
//TODO: LLVM3.8
//MCDisassembler::DecodeStatus S = mDisAsm->getInstruction(inst->mMCInst, size, region, address, nulls(), inst->mAnnotationStream);
@ -526,7 +526,7 @@ bool X86CPU::Decode(uint32 baseAddress, const uint8* dataBase, int dataLength, c
void X86CPU::GetNextPC(uint32 baseAddress, const uint8* dataBase, int dataLength, const uint8* dataPtr, uint32* regs, uint32 nextPCs[2])
{
//DisasmMemoryObject region((uint8*) dataBase, dataLength, baseAddress);
//DisasmMemoryObject region((uint8*) dataBase, dataLength, baseAddress);
uint32 address = baseAddress + (uint32)(dataPtr - dataBase);
uint64 size = 0;
@ -535,17 +535,16 @@ void X86CPU::GetNextPC(uint32 baseAddress, const uint8* dataBase, int dataLength
mDisAsm->CommentStream = &nulls();
ArrayRef<uint8_t> dataArrayRef(dataPtr, dataLength - (dataPtr - dataBase));
MCDisassembler::DecodeStatus S = mDisAsm->getInstruction(mcInst, size, dataArrayRef, address, nulls());
}
bool X86CPU::IsReturnInstruction(X86Instr* inst)
{
const MCInstrDesc &instDesc = mInstrInfo->get(inst->mMCInst.getOpcode());
return (instDesc.getFlags() & (1<<MCID::Return)) != 0;
return (instDesc.getFlags() & (1<<MCID::Return)) != 0;
}
String X86CPU::InstructionToString(X86Instr* inst, uint32 addr)
{
{
StringRef annotationsStr;
SmallVector<char, 256> insnStr;
@ -553,8 +552,8 @@ String X86CPU::InstructionToString(X86Instr* inst, uint32 addr)
//mInstPrinter->CurPCRelImmOffset = addr + inst->GetLength();
mInstPrinter->printInst(&inst->mMCInst, addr, annotationsStr, *mSubtargetInfo, OS);
//OS.flush();
//llvm::StringRef str = OS.str();
//llvm::StringRef str = OS.str();
String result;
for (int idx = 0; idx < (int)insnStr.size(); idx++)
{
@ -570,8 +569,8 @@ String X86CPU::InstructionToString(X86Instr* inst, uint32 addr)
else
result.Append(c);
}
/*String result = String(insnStr.data(), insnStr.size());
/*String result = String(insnStr.data(), insnStr.size());
for (int i = 0; i < (int)result.length(); i++)
{
if (result[i] == '\t')
@ -671,12 +670,12 @@ int X86CPU::GetOpcodesForMnemonic(const StringImpl& mnemonic, Array<int>& outOpc
String s(mnemonic);
std::transform(s.begin(), s.end(), s.begin(), ::tolower);
std::pair<StringToOpcodeMap::iterator, StringToOpcodeMap::iterator> range = mStringToOpcodeMap.equal_range(s);
outOpcodes.Clear();
for (StringToOpcodeMap::iterator it = range.first; it != range.second; ++it)
outOpcodes.push_back(it->second);
return (int)outOpcodes.size();
return (int)outOpcodes.size();
}
void X86CPU::GetClobbersForMnemonic(const StringImpl& mnemonic, int argCount, Array<int>& outImplicitClobberRegNums, int& outClobberArgCount, bool& outMayClobberMem)

View file

@ -193,7 +193,7 @@ public:
struct XmmDReg
{
double d[2];
};
};
struct XmmI32Reg
{
@ -289,7 +289,7 @@ public:
llvm::raw_svector_ostream mAnnotationStream;
static uint8 sRegForm[];
X86Instr() :
X86Instr() :
mAnnotationStream(mAnnotationStr)
{
mX86 = NULL;
@ -297,7 +297,7 @@ public:
mSize = 0;
}
int GetLength();
int GetLength();
bool StackAdjust(uint32& adjust);
bool IsBranch();
bool IsCall();
@ -340,7 +340,7 @@ public:
bool Decode(uint32 baseAddress, const uint8* dataBase, int dataLength, const uint8* dataPtr, X86Instr* inst);
uint32 DecodeThunk(uint32 address, DbgModuleMemoryCache* memoryCache) { return 0; }
bool IsReturnInstruction(X86Instr* inst);
bool IsReturnInstruction(X86Instr* inst);
String InstructionToString(X86Instr* inst, uint32 addr);
void GetNextPC(uint32 baseAddress, const uint8* dataBase, int dataLength, const uint8* dataPtr, uint32* regs, uint32 nextPCs[2]);

View file

@ -103,4 +103,4 @@ X86Target::~X86Target()
{
delete mX86CPU;
delete mX64CPU;
}
}