123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683 |
- #define BF_AST_DO_IMPL
- #include "BfAst.h"
- #include "BfParser.h"
- #include "BfSystem.h"
- USING_NS_BF;
- //////////////////////////////////////////////////////////////////////////
- BfStructuralVisitor::BfStructuralVisitor()
- {
- std::hash<std::string>();
- mCapturingChildRef = false;
- mCurChildRef = NULL;
- }
- void BfStructuralVisitor::VisitMembers(BfBlock* node)
- {
- for (auto& child : *node)
- {
- child->Accept(this);
- }
- }
- void BfStructuralVisitor::VisitChildNoRef(BfAstNode* node)
- {
- mCurChildRef = NULL;
- node->Accept(this);
- mCurChildRef = NULL;
- }
- void BfStructuralVisitor::DoVisitChild(BfAstNode*& node)
- {
- if (node == NULL)
- return;
- mCurChildRef = &node;
- node->Accept(this);
- mCurChildRef = NULL;
- }
- void BfStructuralVisitor::AssertValidChildAddr(BfAstNode** nodeRef)
- {
- //auto bfSource = (*nodeRef)->mSource;
- //BF_ASSERT(bfSource->mAlloc.ContainsPtr(nodeRef));
- }
- void BfStructuralVisitor::Visit(BfLabeledBlock* labeledBlock)
- {
- Visit(labeledBlock->ToBase());
- }
- void BfStructuralVisitor::Visit(BfScopeNode* scopeNode)
- {
- Visit(scopeNode->ToBase());
- }
- void BfStructuralVisitor::Visit(BfNewNode* newNode)
- {
- Visit(newNode->ToBase());
- }
- void BfStructuralVisitor::Visit(BfTypedValueExpression* typedValueExpr)
- {
- Visit(typedValueExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfCommentNode* commentNode)
- {
- Visit(commentNode->ToBase());
- }
- void BfStructuralVisitor::Visit(BfPreprocesorIgnoredSectionNode* preprocesorIgnoredSection)
- {
- Visit(preprocesorIgnoredSection->ToBase());
- }
- void BfStructuralVisitor::Visit(BfPreprocessorNode* preprocessorNode)
- {
- Visit(preprocessorNode->ToBase());
- }
- void BfStructuralVisitor::Visit(BfPreprocessorDefinedExpression* definedExpr)
- {
- Visit(definedExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfAttributeDirective* attributeDirective)
- {
- Visit(attributeDirective->ToBase());
- }
- void BfStructuralVisitor::Visit(BfGenericParamsDeclaration* genericParams)
- {
- Visit(genericParams->ToBase());
- }
- void BfStructuralVisitor::Visit(BfGenericConstraintsDeclaration* genericConstraints)
- {
- Visit(genericConstraints->ToBase());
- }
- void BfStructuralVisitor::Visit(BfGenericArgumentsNode* genericArgumentsNode)
- {
- Visit(genericArgumentsNode->ToBase());
- }
- void BfStructuralVisitor::Visit(BfStatement* stmt)
- {
- Visit(stmt->ToBase());
- }
- void BfStructuralVisitor::Visit(BfLabelableStatement* labelableStmt)
- {
- Visit(labelableStmt->ToBase());
- }
- void BfStructuralVisitor::Visit(BfExpression* expr)
- {
- Visit(expr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfExpressionStatement* exprStmt)
- {
- Visit(exprStmt->ToBase());
- }
- void BfStructuralVisitor::Visit(BfAttributedExpression* attribExpr)
- {
- Visit(attribExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfEmptyStatement* emptyStmt)
- {
- Visit(emptyStmt->ToBase());
- }
- void BfStructuralVisitor::Visit(BfTokenNode* tokenNode)
- {
- Visit(tokenNode->ToBase());
- }
- void BfStructuralVisitor::Visit(BfTokenPairNode* tokenPairNode)
- {
- Visit(tokenPairNode->ToBase());
- }
- void BfStructuralVisitor::Visit(BfLiteralExpression* literalExpr)
- {
- Visit(literalExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfIdentifierNode* identifierNode)
- {
- Visit(identifierNode->ToBase());
- }
- void BfStructuralVisitor::Visit(BfAttributedIdentifierNode* attrIdentifierNode)
- {
- Visit(attrIdentifierNode->ToBase());
- }
- void BfStructuralVisitor::Visit(BfQualifiedNameNode* nameNode)
- {
- Visit(nameNode->ToBase());
- }
- void BfStructuralVisitor::Visit(BfThisExpression* thisExpr)
- {
- Visit(thisExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfBaseExpression* baseExpr)
- {
- Visit(baseExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfMixinExpression* mixinExpr)
- {
- Visit(mixinExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfSizedArrayCreateExpression* createExpr)
- {
- Visit(createExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfCollectionInitializerExpression* collectionInitExpr)
- {
- Visit(collectionInitExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfArraySizeSpecifier* arraySizeSpecifier)
- {
- Visit(arraySizeSpecifier->ToBase());
- }
- void BfStructuralVisitor::Visit(BfTypeReference* typeRef)
- {
- Visit(typeRef->ToBase());
- }
- void BfStructuralVisitor::Visit(BfNamedTypeReference* typeRef)
- {
- Visit(typeRef->ToBase());
- }
- void BfStructuralVisitor::Visit(BfQualifiedTypeReference* qualifiedTypeRef)
- {
- Visit(qualifiedTypeRef->ToBase());
- }
- void BfStructuralVisitor::Visit(BfDotTypeReference * typeRef)
- {
- Visit(typeRef->ToBase());
- }
- void BfStructuralVisitor::Visit(BfVarTypeReference* typeRef)
- {
- Visit(typeRef->ToBase());
- }
- void BfStructuralVisitor::Visit(BfVarRefTypeReference* typeRef)
- {
- Visit(typeRef->ToBase());
- }
- void BfStructuralVisitor::Visit(BfLetTypeReference* typeRef)
- {
- Visit(typeRef->ToBase());
- }
- void BfStructuralVisitor::Visit(BfConstTypeRef* typeRef)
- {
- Visit(typeRef->ToBase());
- }
- void BfStructuralVisitor::Visit(BfConstExprTypeRef* typeRef)
- {
- Visit(typeRef->ToBase());
- }
- void BfStructuralVisitor::Visit(BfRefTypeRef* typeRef)
- {
- Visit(typeRef->ToBase());
- }
- void BfStructuralVisitor::Visit(BfRetTypeTypeRef* typeRef)
- {
- Visit(typeRef->ToBase());
- }
- void BfStructuralVisitor::Visit(BfArrayTypeRef* typeRef)
- {
- Visit(typeRef->ToBase());
- }
- void BfStructuralVisitor::Visit(BfGenericInstanceTypeRef* typeRef)
- {
- Visit(typeRef->ToBase());
- }
- void BfStructuralVisitor::Visit(BfTupleTypeRef* typeRef)
- {
- Visit(typeRef->ToBase());
- }
- void BfStructuralVisitor::Visit(BfDelegateTypeRef* typeRef)
- {
- Visit(typeRef->ToBase());
- }
- void BfStructuralVisitor::Visit(BfDeclTypeRef* declTypeRef)
- {
- Visit(declTypeRef->ToBase());
- }
- void BfStructuralVisitor::Visit(BfPointerTypeRef* typeRef)
- {
- Visit(typeRef->ToBase());
- }
- void BfStructuralVisitor::Visit(BfNullableTypeRef* typeRef)
- {
- Visit(typeRef->ToBase());
- }
- void BfStructuralVisitor::Visit(BfVariableDeclaration* varDecl)
- {
- Visit(varDecl->ToBase());
- }
- void BfStructuralVisitor::Visit(BfLocalMethodDeclaration* methodDecl)
- {
- Visit(methodDecl->ToBase());
- }
- void BfStructuralVisitor::Visit(BfParameterDeclaration* paramDecl)
- {
- Visit(paramDecl->ToBase());
- }
- void BfStructuralVisitor::Visit(BfParamsExpression* paramsExpr)
- {
- Visit(paramsExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfTypeAttrExpression* typeAttrExpr)
- {
- Visit(typeAttrExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfTypeOfExpression* typeOfExpr)
- {
- Visit(typeOfExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfSizeOfExpression* sizeOfExpr)
- {
- Visit(sizeOfExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfAlignOfExpression* alignOfExpr)
- {
- Visit(alignOfExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfStrideOfExpression* strideOfExpr)
- {
- Visit(strideOfExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfDefaultExpression* defaultExpr)
- {
- Visit(defaultExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfUninitializedExpression* uninitializedExpr)
- {
- Visit(uninitializedExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfCheckTypeExpression* checkTypeExpr)
- {
- Visit(checkTypeExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfDynamicCastExpression* dynCastExpr)
- {
- Visit(dynCastExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfCastExpression* castExpr)
- {
- Visit(castExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfDelegateBindExpression* bindExpr)
- {
- Visit(bindExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfLambdaBindExpression* lambdaBindExpr)
- {
- Visit(lambdaBindExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfObjectCreateExpression* newExpr)
- {
- Visit(newExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfBoxExpression* boxExpr)
- {
- Visit(boxExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfThrowStatement* throwStmt)
- {
- Visit(throwStmt->ToBase());
- }
- void BfStructuralVisitor::Visit(BfDeleteStatement* deleteStmt)
- {
- Visit(deleteStmt->ToBase());
- }
- void BfStructuralVisitor::Visit(BfScopedInvocationTarget* scopedTarget)
- {
- Visit(scopedTarget->ToBase());
- }
- void BfStructuralVisitor::Visit(BfInvocationExpression* invocationExpr)
- {
- Visit(invocationExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfEnumCaseBindExpression* caseBindExpr)
- {
- Visit(caseBindExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfCaseExpression* caseExpr)
- {
- Visit(caseExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfSwitchCase* switchCase)
- {
- Visit(switchCase->ToBase());
- }
- void BfStructuralVisitor::Visit(BfWhenExpression* whenExpr)
- {
- Visit(whenExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfSwitchStatement* switchStmt)
- {
- Visit(switchStmt->ToBase());
- }
- void BfStructuralVisitor::Visit(BfTryStatement* tryStmt)
- {
- Visit(tryStmt->ToBase());
- }
- void BfStructuralVisitor::Visit(BfCatchStatement* catchStmt)
- {
- Visit(catchStmt->ToBase());
- }
- void BfStructuralVisitor::Visit(BfFinallyStatement* finallyStmt)
- {
- Visit(finallyStmt->ToBase());
- }
- void BfStructuralVisitor::Visit(BfCheckedStatement* checkedStmt)
- {
- Visit(checkedStmt->ToBase());
- }
- void BfStructuralVisitor::Visit(BfUncheckedStatement* uncheckedStmt)
- {
- Visit(uncheckedStmt->ToBase());
- }
- void BfStructuralVisitor::Visit(BfIfStatement* ifStmt)
- {
- Visit(ifStmt->ToBase());
- }
- void BfStructuralVisitor::Visit(BfDeferStatement* deferStmt)
- {
- Visit(deferStmt->ToBase());
- }
- void BfStructuralVisitor::Visit(BfReturnStatement* returnStmt)
- {
- Visit(returnStmt->ToBase());
- }
- void BfStructuralVisitor::Visit(BfYieldStatement* yieldStmt)
- {
- Visit(yieldStmt->ToBase());
- }
- void BfStructuralVisitor::Visit(BfUsingStatement* whileStmt)
- {
- Visit(whileStmt->ToBase());
- }
- void BfStructuralVisitor::Visit(BfDoStatement* doStmt)
- {
- Visit(doStmt->ToBase());
- }
- void BfStructuralVisitor::Visit(BfRepeatStatement* repeatStmt)
- {
- Visit(repeatStmt->ToBase());
- }
- void BfStructuralVisitor::Visit(BfWhileStatement* whileStmt)
- {
- Visit(whileStmt->ToBase());
- }
- void BfStructuralVisitor::Visit(BfBreakStatement* breakStmt)
- {
- Visit(breakStmt->ToBase());
- }
- void BfStructuralVisitor::Visit(BfContinueStatement* continueStmt)
- {
- Visit(continueStmt->ToBase());
- }
- void BfStructuralVisitor::Visit(BfFallthroughStatement* fallthroughStmt)
- {
- Visit(fallthroughStmt->ToBase());
- }
- void BfStructuralVisitor::Visit(BfForStatement* forStmt)
- {
- Visit(forStmt->ToBase());
- }
- void BfStructuralVisitor::Visit(BfForEachStatement* forEachStmt)
- {
- Visit(forEachStmt->ToBase());
- }
- void BfStructuralVisitor::Visit(BfConditionalExpression* condExpr)
- {
- Visit(condExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfAssignmentExpression* assignExpr)
- {
- Visit(assignExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfParenthesizedExpression* parenExpr)
- {
- Visit(parenExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfTupleExpression* tupleExpr)
- {
- Visit(tupleExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfMemberReferenceExpression* memberRefExpr)
- {
- Visit(memberRefExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfIndexerExpression* indexerExpr)
- {
- Visit(indexerExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfUnaryOperatorExpression* binOpExpr)
- {
- Visit(binOpExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfBinaryOperatorExpression* binOpExpr)
- {
- Visit(binOpExpr->ToBase());
- }
- void BfStructuralVisitor::Visit(BfConstructorDeclaration* ctorDeclaration)
- {
- Visit(ctorDeclaration->ToBase());
- }
- void BfStructuralVisitor::Visit(BfDestructorDeclaration* dtorDeclaration)
- {
- Visit(dtorDeclaration->ToBase());
- }
- void BfStructuralVisitor::Visit(BfMethodDeclaration* methodDeclaration)
- {
- Visit(methodDeclaration->ToBase());
- }
- void BfStructuralVisitor::Visit(BfOperatorDeclaration* operatorDeclaration)
- {
- Visit(operatorDeclaration->ToBase());
- }
- void BfStructuralVisitor::Visit(BfPropertyMethodDeclaration* propertyMethodDeclaration)
- {
- Visit(propertyMethodDeclaration->ToBase());
- }
- void BfStructuralVisitor::Visit(BfPropertyBodyExpression* propertyBodyExpression)
- {
- Visit(propertyBodyExpression->ToBase());
- }
- void BfStructuralVisitor::Visit(BfPropertyDeclaration* propertyDeclaration)
- {
- Visit(propertyDeclaration->ToBase());
- }
- void BfStructuralVisitor::Visit(BfIndexerDeclaration* indexerDeclaration)
- {
- Visit(indexerDeclaration->ToBase());
- }
- void BfStructuralVisitor::Visit(BfFieldDeclaration* fieldDeclaration)
- {
- Visit(fieldDeclaration->ToBase());
- }
- void BfStructuralVisitor::Visit(BfEnumCaseDeclaration* enumCaseDeclaration)
- {
- Visit(enumCaseDeclaration->ToBase());
- }
- void BfStructuralVisitor::Visit(BfFieldDtorDeclaration* fieldDtorDeclaration)
- {
- Visit(fieldDtorDeclaration->ToBase());
- }
- void BfStructuralVisitor::Visit(BfTypeDeclaration* typeDeclaration)
- {
- Visit(typeDeclaration->ToBase());
- }
- void BfStructuralVisitor::Visit(BfTypeAliasDeclaration* typeDeclaration)
- {
- Visit(typeDeclaration->ToBase());
- }
- void BfStructuralVisitor::Visit(BfUsingDirective* usingDirective)
- {
- Visit(usingDirective->ToBase());
- }
- void BfStructuralVisitor::Visit(BfUsingStaticDirective * usingDirective)
- {
- Visit(usingDirective->ToBase());
- }
- void BfStructuralVisitor::Visit(BfNamespaceDeclaration* namespaceDeclaration)
- {
- Visit(namespaceDeclaration->ToBase());
- }
- void BfStructuralVisitor::Visit(BfBlock* block)
- {
- Visit(block->ToBase());
- }
- void BfStructuralVisitor::Visit(BfBlockExtension* block)
- {
- BF_ASSERT("Shouldn't see this block, BfBlock::Iterator not being used?");
- }
- void BfStructuralVisitor::Visit(BfRootNode* rootNode)
- {
- Visit(rootNode->ToBase());
- }
- void BfStructuralVisitor::Visit(BfInlineAsmStatement* asmStmt)
- {
- Visit(asmStmt->ToBase());
- }
- void BfStructuralVisitor::Visit(BfInlineAsmInstruction* asmInst)
- {
- Visit(asmInst->ToBase());
- }
- //////////////////////////////////////////////////////////////////////////
- static Array<BfAstTypeInfo*> gTypes;
- static Array<BfAstAcceptFunc> gAcceptFuncs;
- static int sTypeCount;
- BfAstTypeInfo::BfAstTypeInfo(const char* name, BfAstTypeInfo* baseType, BfAstAcceptFunc acceptFunc)
- {
- mName = name;
- mBaseType = baseType;
- mAcceptFunc = acceptFunc;
- if (mBaseType != NULL)
- {
- mBaseType->mDerivedTypes.Add(this);
- }
- sTypeCount++;
- #ifdef _DEBUG
- auto checkBase = mBaseType;
- while (checkBase != NULL)
- {
- if (checkBase == &BfAstNode::sTypeInfo)
- break;
- checkBase = checkBase->mBaseType;
- }
- #endif
- }
- static void AddTypeInfo(BfAstTypeInfo* typeInfo)
- {
- BF_ASSERT(typeInfo->mTypeId == 0);
- typeInfo->mTypeId = (uint8)gTypes.size();
- gTypes.Add(typeInfo);
- gAcceptFuncs.Add(typeInfo->mAcceptFunc);
- for (auto derivedType : typeInfo->mDerivedTypes)
- AddTypeInfo(derivedType);
- typeInfo->mFullDerivedCount = (uint8)(gTypes.size() - typeInfo->mTypeId - 1);
- }
- void BfAstTypeInfo::Init()
- {
- if (!gTypes.IsEmpty())
- return;
- gTypes.Add(NULL);
- gAcceptFuncs.Add(NULL);
- AddTypeInfo(&BfAstNode::sTypeInfo);
- }
- BfIdentifierNode* Beefy::BfIdentifierCast(BfAstNode* node)
- {
- if (node == NULL)
- return NULL;
- if (node->GetTypeId() == BfAttributedIdentifierNode::sTypeInfo.mTypeId)
- return ((BfAttributedIdentifierNode*)node)->mIdentifier;
- bool canCast = (uint)node->GetTypeId() - (uint)BfIdentifierNode::sTypeInfo.mTypeId <= (uint)BfIdentifierNode::sTypeInfo.mFullDerivedCount;
- return canCast ? (BfIdentifierNode*)node : NULL;
- }
- BfAstNode* Beefy::BfNodeToNonTemporary(BfAstNode* node)
- {
- if (node == NULL)
- return NULL;
- if (node->GetTypeId() == BfNamedTypeReference::sTypeInfo.mTypeId)
- {
- auto namedTypeRef = (BfNamedTypeReference*)node;
- if (namedTypeRef->IsTemporary())
- return BfNodeToNonTemporary(namedTypeRef->mNameNode);
- return namedTypeRef;
- }
- if (!node->IsTemporary())
- return node;
- return NULL;
- }
- //////////////////////////////////////////////////////////////////////////
- bool BfAstNode::IsMissingSemicolon()
- {
- if (auto deferStmt = BfNodeDynCast<BfDeferStatement>(this))
- return BfNodeDynCastExact<BfBlock>(deferStmt->mTargetNode) == NULL;
- if (auto stmt = BfNodeDynCast<BfStatement>(this))
- return stmt->mTrailingSemicolon == NULL;
- return false;
- }
- bool BfAstNode::IsExpression()
- {
- if (auto deferStmt = BfNodeDynCast<BfDeferStatement>(this))
- return BfNodeDynCastExact<BfBlock>(deferStmt->mTargetNode) == NULL;
- if (auto block = BfNodeDynCast<BfBlock>(this))
- {
- if (block->mChildArr.mSize == 0)
- return false;
- return block->mChildArr.GetLast()->IsExpression();
- }
- return IsA<BfExpression>();
- }
- bool BfAstNode::LocationEquals(BfAstNode* otherNode)
- {
- return (GetSourceData() == otherNode->GetSourceData()) &&
- (GetSrcStart() == otherNode->GetSrcStart()) &&
- (GetSrcEnd() == otherNode->GetSrcEnd());
- }
- bool BfAstNode::LocationEndEquals(BfAstNode* otherNode)
- {
- return (GetSourceData() == otherNode->GetSourceData()) &&
- (GetSrcEnd() == otherNode->GetSrcEnd());
- }
- void BfAstNode::Add(BfAstNode* bfAstNode)
- {
- #ifdef BF_AST_HAS_PARENT_MEMBER
- BF_ASSERT(bfAstNode->mParent == NULL);
- bfAstNode->mParent = this;
- #endif
- if (!IsInitialized())
- {
- int childTriviaStart;
- int childSrcStart;
- int childSrcEnd;
- bfAstNode->GetSrcPositions(childTriviaStart, childSrcStart, childSrcEnd);
- Init(childTriviaStart, childSrcStart, childSrcEnd);
- return;
- }
- #ifdef BF_AST_COMPACT
- int childTriviaStart;
- int childSrcStart;
- int childSrcEnd;
- bfAstNode->GetSrcPositions(childTriviaStart, childSrcStart, childSrcEnd);
- int prevTriviaStart;
- int prevSrcStart;
- int prevSrcEnd;
- GetSrcPositions(prevTriviaStart, prevSrcStart, prevSrcEnd);
- if (childTriviaStart < prevTriviaStart)
- SetTriviaStart(childTriviaStart);
- if (childSrcStart < prevSrcStart)
- SetSrcStart(childSrcStart);
- if (childSrcEnd > prevSrcEnd)
- SetSrcEnd(childSrcEnd);
- #else
- BF_ASSERT(mSrcStart >= 0);
- BF_ASSERT(bfAstNode->mSrcStart >= 0);
- mSrcStart = BF_MIN(mSrcStart, bfAstNode->mSrcStart);
- mSrcEnd = BF_MAX(mSrcEnd, bfAstNode->mSrcEnd);
- #endif
- }
- #ifdef BF_AST_COMPACT
- BfAstInfo* BfAstNode::AllocAstInfo()
- {
- return GetSource()->mAlloc.Alloc<BfAstInfo>();
- }
- #endif
- void BfAstNode::RemoveSelf()
- {
- //mParent->mChildren.Remove(this);
- #ifdef BF_AST_HAS_PARENT_MEMBER
- mParent = NULL;
- #endif
- }
- void BfAstNode::DeleteSelf()
- {
- //if (mParent != NULL)
- //mParent->mChildren.Remove(this);
- delete this;
- }
- void BfAstNode::RemoveNextSibling()
- {
- //mNext->RemoveSelf();
- }
- void BfAstNode::DeleteNextSibling()
- {
- //mNext->DeleteSelf();
- }
- void BfAstNode::Init(BfParser* bfParser)
- {
- BF_ASSERT(GetSourceData() == bfParser->mSourceData);
- Init(bfParser->mTriviaStart, bfParser->mTokenStart, bfParser->mTokenEnd);
- }
- void BfAstNode::Accept(BfStructuralVisitor* bfVisitor)
- {
- (*gAcceptFuncs[GetTypeId()])(this, bfVisitor);
- }
- bool BfAstNode::IsTemporary()
- {
- #ifdef BF_AST_COMPACT
- return (mIsCompact) && (mCompact_SrcStart == 0) && (mCompact_SrcLen == 0);
- #else
- return (mSrcEnd == 0);
- #endif
- }
- int BfAstNode::GetStartCharId()
- {
- if (!IsTemporary())
- {
- auto bfParser = GetSourceData()->ToParserData();
- if (bfParser != NULL)
- return bfParser->GetCharIdAtIndex(GetSrcStart());
- }
- return GetSrcStart();
- }
- BfSourceData* BfAstNode::GetSourceData()
- {
- #ifdef BF_AST_ALLOCATOR_USE_PAGES
- //BF_ASSERT((intptr)this > 0x4200000000);
- BfAstPageHeader* pageHeader = (BfAstPageHeader*)((intptr)this & ~(BfAstAllocManager::PAGE_SIZE - 1));
- return pageHeader->mSourceData;
- #else
- return mSourceData;
- #endif
- }
- BfParser* BfAstNode::GetParser()
- {
- BfSourceData* sourceData = GetSourceData();
- if (sourceData == NULL)
- return NULL;
- return sourceData->ToParser();
- }
- bool BfAstNode::IsFromParser(BfParser* parser)
- {
- if (parser == NULL)
- return false;
- if (IsTemporary())
- return false;
- BfSourceData* sourceData = GetSourceData();
- if (sourceData == NULL)
- return false;
- return parser == sourceData->ToParser();
- }
- String BfAstNode::ToString()
- {
- int srcLen = GetSrcLength();
- if (srcLen <= 0)
- {
- if (auto namedTypeRef = BfNodeDynCast<BfNamedTypeReference>(this))
- return namedTypeRef->mNameNode->ToString();
- return "";
- }
- auto source = GetSourceData();
- String str(source->mSrc + GetSrcStart(), srcLen);
- return str;
- }
- StringView BfAstNode::ToStringView()
- {
- int srcLen = GetSrcLength();
- if (srcLen <= 0)
- {
- if (auto namedTypeRef = BfNodeDynCast<BfNamedTypeReference>(this))
- return namedTypeRef->mNameNode->ToStringView();
- return StringView();
- }
- auto source = GetSourceData();
- return StringView(source->mSrc + GetSrcStart(), srcLen);
- }
- void BfAstNode::ToString(StringImpl& str)
- {
- int srcLen = GetSrcLength();
- if (srcLen <= 0)
- {
- if (auto namedTypeRef = BfNodeDynCast<BfNamedTypeReference>(this))
- namedTypeRef->mNameNode->ToString(str);
- return;
- }
- auto source = GetSourceData();
- str.Append(source->mSrc + GetSrcStart(), srcLen);
- }
- //////////////////////////////////////////////////////////////////////////
- void BfBlock::Init(const SizedArrayImpl<BfAstNode*>& vec, BfAstAllocator* alloc)
- {
- #ifdef BF_USE_NEAR_NODE_REF
- int curIdx = 0;
- int elemsLeft = (int)vec.size();
- BfBlockExtension* curExt = NULL;
- while (elemsLeft > 0)
- {
- int bytesLeft = alloc->GetCurPageBytesLeft();
- int useElems = std::min(bytesLeft / (int)sizeof(ASTREF(BfAstNode*)), elemsLeft);
- 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)
- {
- nextExt = alloc->Alloc<BfBlockExtension>();
- useElems--;
- }
- for (int i = 0; i < useElems; i++)
- childArrRef[i] = vec[curIdx++];
- if (nextExt != NULL)
- {
- childArrRef[useElems] = nextExt;
- curExt = nextExt;
- }
- elemsLeft -= useElems;
- }
- #else
- BfSizedArrayInitIndirect(mChildArr, vec, alloc);
- #endif
- }
- BfAstNode* BfBlock::GetFirst()
- {
- if (mChildArr.mSize == 0)
- return NULL;
- return mChildArr.mVals[0];
- }
- BfAstNode* BfBlock::GetLast()
- {
- if (mChildArr.mSize == 0)
- return NULL;
- auto backNode = mChildArr.mVals[mChildArr.mSize - 1];
- while (auto blockExt = BfNodeDynCastExact<BfBlockExtension>(backNode))
- backNode = blockExt->mChildArr.GetLast();
- return backNode;
- }
- int BfBlock::GetSize()
- {
- int size = mChildArr.mSize;
- if (mChildArr.mSize == 0)
- return size;
- BfAstNode* backNode = mChildArr.mVals[mChildArr.mSize - 1];
- while (true)
- {
- if (auto blockExt = BfNodeDynCastExact<BfBlockExtension>(backNode))
- {
- size--;
- size += blockExt->mChildArr.mSize;
- backNode = blockExt->mChildArr.mVals[blockExt->mChildArr.mSize - 1];
- }
- else
- {
- break;
- }
- }
-
- return size;
- }
- void BfBlock::SetSize(int wantSize)
- {
- int size = mChildArr.mSize;
- if (wantSize == size)
- return;
- if (wantSize < size)
- {
- mChildArr.mSize = wantSize;
- }
- else
- {
- BfAstNode* backNode = mChildArr.mVals[mChildArr.mSize - 1];
- while (true)
- {
- if (auto blockExt = BfNodeDynCastExact<BfBlockExtension>(backNode))
- {
- size--;
- size += blockExt->mChildArr.mSize;
- if (wantSize < size)
- {
- blockExt->mChildArr.mSize -= (size - wantSize);
- break;
- }
- backNode = blockExt->mChildArr.mVals[blockExt->mChildArr.mSize - 1];
- }
- else
- {
- break;
- }
- }
- }
- BF_ASSERT(wantSize == GetSize());
- }
- //////////////////////////////////////////////////////////////////////////
- bool BfTypeReference::IsNamedTypeReference()
- {
- return IsA<BfNamedTypeReference>() || IsA<BfDirectStrTypeReference>();
- }
- bool BfTypeReference::IsTypeDefTypeReference()
- {
- return IsA<BfNamedTypeReference>() || IsA<BfDirectStrTypeReference>() || IsA<BfDirectTypeDefReference>();
- }
- //////////////////////////////////////////////////////////////////////////
- BfPropertyMethodDeclaration* BfPropertyDeclaration::GetMethod(const StringImpl& findName)
- {
- String methodName;
- for (auto& methodDeclaration : mMethods)
- {
- if (methodDeclaration->mNameNode != NULL)
- {
- methodName.Clear();
- methodDeclaration->mNameNode->ToString(methodName);
- if (methodName == findName)
- return methodDeclaration;
- }
- }
- return NULL;
- }
- //////////////////////////////////////////////////////////////////////////
- bool BfExpression::VerifyIsStatement(BfPassInstance* passInstance, bool ignoreError)
- {
- if (auto attribExpr = BfNodeDynCast<BfAttributedExpression>(this))
- {
- return attribExpr->mExpression->VerifyIsStatement(passInstance, ignoreError);
- }
- if ((!BfNodeIsExact<BfAssignmentExpression>(this)) &&
- (!BfNodeIsExact<BfInvocationExpression>(this)) &&
- (!BfNodeIsExact<BfObjectCreateExpression>(this)))
- {
- if (auto castExpr = BfNodeDynCast<BfCastExpression>(this))
- {
- if ((castExpr->mTypeRef != NULL) && (castExpr->mTypeRef->ToString() == "void"))
- {
- // Is "(void)variable;" expression, used to remove warning about unused local variables
- return false;
- }
- }
- if (!ignoreError)
- passInstance->Fail("This expression cannot be used as a statement", this);
- //passInstance->Fail("Only assignment, call, increment, decrement, and allocation expressions can be used as a statement", this);
- return false;
- }
- return true;
- }
- //////////////////////////////////////////////////////////////////////////
- bool BfAttributeDirective::Contains(const StringImpl& findName)
- {
- StringT<128> name;
- auto attrDirective = this;
- while (attrDirective != NULL)
- {
- name.clear();
- if (attrDirective->mAttributeTypeRef != NULL)
- attrDirective->mAttributeTypeRef->ToString(name);
- if (findName == name)
- return true;
- if (name.EndsWith("Attribute"))
- {
- name.RemoveToEnd(name.length() - 9);
- if (findName == name)
- return true;
- }
- attrDirective = attrDirective->mNextAttribute;
- }
- return false;
- }
- //////////////////////////////////////////////////////////////////////////
- const char* Beefy::BfTokenToString(BfToken token)
- {
- switch (token)
- {
- case BfToken_Abstract:
- return "abstract";
- case BfToken_AlignOf:
- return "alignof";
- case BfToken_Append:
- return "append";
- case BfToken_As:
- return "as";
- case BfToken_Asm:
- return "asm";
- case BfToken_AsmNewline:
- return "\n";
- case BfToken_Base:
- return "base";
- case BfToken_Box:
- return "box";
- case BfToken_Break:
- return "break";
- case BfToken_Case:
- return "case";
- case BfToken_Catch:
- return "catch";
- case BfToken_Checked:
- return "checked";
- case BfToken_Class:
- return "class";
- case BfToken_Concrete:
- return "concrete";
- case BfToken_Const:
- return "const";
- case BfToken_Continue:
- return "continue";
- case BfToken_Decltype:
- return "decltype";
- case BfToken_Default:
- return "default";
- case BfToken_Defer:
- return "defer";
- case BfToken_Delegate:
- return "delegate";
- case BfToken_Delete:
- return "delete";
- case BfToken_Do:
- return "do";
- case BfToken_Else:
- return "else";
- case BfToken_Enum:
- return "enum";
- case BfToken_Explicit:
- return "explicit";
- case BfToken_Extern:
- return "extern";
- case BfToken_Extension:
- return "extension";
- case BfToken_Fallthrough:
- return "fallthrough";
- case BfToken_Finally:
- return "finally";
- case BfToken_Fixed:
- return "fixed";
- case BfToken_For:
- return "for";
- case BfToken_Function:
- return "function";
- case BfToken_Goto:
- return "got";
- case BfToken_If:
- return "if";
- case BfToken_Implicit:
- return "implicit";
- case BfToken_In:
- return "in";
- case BfToken_Interface:
- return "interface";
- case BfToken_Internal:
- return "internal";
- case BfToken_Is:
- return "is";
- case BfToken_Let:
- return "let";
- case BfToken_Mixin:
- return "mixin";
- case BfToken_Mut:
- return "mut";
- case BfToken_Namespace:
- return "namespace";
- case BfToken_New:
- return "new";
- case BfToken_Null:
- return "null";
- case BfToken_Operator:
- return "operator";
- case BfToken_Out:
- return "out";
- case BfToken_Override:
- return "override";
- case BfToken_Params:
- return "params";
- case BfToken_Private:
- return "private";
- case BfToken_Protected:
- return "protected";
- case BfToken_Public:
- return "public";
- case BfToken_ReadOnly:
- return "readonly";
- case BfToken_Repeat:
- return "repeat";
- case BfToken_Ref:
- return "ref";
- case BfToken_RetType:
- return "rettype";
- case BfToken_Return:
- return "return";
- case BfToken_Scope:
- return "scope";
- case BfToken_Sealed:
- return "sealed";
- case BfToken_SizeOf:
- return "sizeof";
- case BfToken_Stack:
- return "stack";
- case BfToken_Static:
- return "static";
- case BfToken_StrideOf:
- return "strideof";
- case BfToken_Struct:
- return "struct";
- case BfToken_Switch:
- return "switch";
- case BfToken_This:
- return "this";
- case BfToken_Throw:
- return "throw";
- case BfToken_Try:
- return "try";
- case BfToken_TypeAlias:
- return "typealias";
- case BfToken_TypeOf:
- return "typeof";
- case BfToken_Unchecked:
- return "unchecked";
- case BfToken_Unsigned:
- return "unsigned";
- case BfToken_Using:
- return "using";
- case BfToken_Var:
- return "var";
- case BfToken_Virtual:
- return "virtual";
- case BfToken_Volatile:
- return "volatile";
- case BfToken_When:
- return "when";
- case BfToken_Where:
- return "where";
- case BfToken_While:
- return "while";
- case BfToken_Yield:
- return "yield";
- case BfToken_AssignEquals:
- return "=";
- case BfToken_CompareEquals:
- return "==";
- case BfToken_CompareNotEquals:
- return "!=";
- case BfToken_LessEquals:
- return "<=";
- case BfToken_GreaterEquals:
- return ">=";
- case BfToken_Spaceship:
- return "<=>";
- case BfToken_PlusEquals:
- return "+=";
- case BfToken_MinusEquals:
- return "-=";
- case BfToken_MultiplyEquals:
- return "*=";
- case BfToken_DivideEquals:
- return "/=";
- case BfToken_ModulusEquals:
- return "%=";
- case BfToken_ShiftLeftEquals:
- return "<<=";
- case BfToken_ShiftRightEquals:
- return ">>=";
- case BfToken_AndEquals:
- return "&=";
- case BfToken_OrEquals:
- return "|=";
- case BfToken_XorEquals:
- return "^=";
- case BfToken_LBrace:
- return "{";
- case BfToken_RBrace:
- return "}";
- case BfToken_LParen:
- return "(";
- case BfToken_RParen:
- return ")";
- case BfToken_LBracket:
- return "[";
- case BfToken_RBracket:
- return "]";
- case BfToken_LChevron:
- return "<";
- case BfToken_RChevron:
- return ">";
- case BfToken_LDblChevron:
- return "<<";
- case BfToken_RDblChevron:
- return ">>";
- case BfToken_Semicolon:
- return ";";
- case BfToken_Colon:
- return ":";
- case BfToken_Comma:
- return ",";
- case BfToken_Dot:
- case BfToken_AutocompleteDot:
- return ".";
- case BfToken_DotDot:
- return "..";
- case BfToken_QuestionDot:
- return "?.";
- case BfToken_QuestionLBracket:
- return "?[";
- case BfToken_Plus:
- return "+";
- case BfToken_Minus:
- return "-";
- case BfToken_DblPlus:
- return "++";
- case BfToken_DblMinus:
- return "--";
- case BfToken_Star:
- return "*";
- case BfToken_ForwardSlash:
- return "/";
- case BfToken_Modulus:
- return "%";
- case BfToken_Ampersand:
- return "&";
- case BfToken_At:
- return "@";
- case BfToken_DblAmpersand:
- return "&&";
- case BfToken_Bar:
- return "|";
- case BfToken_DblBar:
- return "||";
- case BfToken_Bang:
- return "!";
- case BfToken_Carat:
- return "^";
- case BfToken_Tilde:
- return "~";
- case BfToken_Question:
- return "?";
- case BfToken_DblQuestion:
- return "??";
- case BfToken_Arrow:
- return "->";
- case BfToken_FatArrow:
- return "=>";
- default:
- break;
- }
- BF_FATAL("Unknown token");
- return NULL;
- }
- bool Beefy::BfTokenIsKeyword(BfToken token)
- {
- return (token >= BfToken_Abstract) && (token <= BfToken_Yield);
- }
- BfBinaryOp Beefy::BfAssignOpToBinaryOp(BfAssignmentOp assignmentOp)
- {
- switch (assignmentOp)
- {
- case BfAssignmentOp_Add:
- return BfBinaryOp_Add;
- case BfAssignmentOp_Subtract:
- return BfBinaryOp_Subtract;
- case BfAssignmentOp_Multiply:
- return BfBinaryOp_Multiply;
- case BfAssignmentOp_Divide:
- return BfBinaryOp_Divide;
- case BfAssignmentOp_Modulus:
- return BfBinaryOp_Modulus;
- case BfAssignmentOp_ShiftLeft:
- return BfBinaryOp_LeftShift;
- case BfAssignmentOp_ShiftRight:
- return BfBinaryOp_RightShift;
- case BfAssignmentOp_BitwiseAnd:
- return BfBinaryOp_BitwiseAnd;
- case BfAssignmentOp_BitwiseOr:
- return BfBinaryOp_BitwiseOr;
- case BfAssignmentOp_ExclusiveOr:
- return BfBinaryOp_ExclusiveOr;
- default:
- break;
- }
- return BfBinaryOp_None;
- }
- int Beefy::BfGetBinaryOpPrecendence(BfBinaryOp binOp)
- {
- switch (binOp)
- {
- case BfBinaryOp_LeftShift:
- case BfBinaryOp_RightShift:
- return 10;
- case BfBinaryOp_Multiply:
- case BfBinaryOp_Divide:
- case BfBinaryOp_Modulus:
- case BfBinaryOp_BitwiseAnd:
- return 9;
- case BfBinaryOp_Add:
- case BfBinaryOp_Subtract:
- case BfBinaryOp_ExclusiveOr:
- case BfBinaryOp_BitwiseOr:
- return 8;
- // "Range" inserted here if we were copying swift
- case BfBinaryOp_Is:
- case BfBinaryOp_As:
- return 7;
- case BfBinaryOp_Compare:
- return 6;
- case BfBinaryOp_GreaterThan:
- case BfBinaryOp_LessThan:
- case BfBinaryOp_GreaterThanOrEqual:
- case BfBinaryOp_LessThanOrEqual:
- return 5;
- case BfBinaryOp_Equality:
- case BfBinaryOp_InEquality:
- return 4;
- case BfBinaryOp_ConditionalAnd:
- return 3;
- case BfBinaryOp_ConditionalOr:
- return 2;
- case BfBinaryOp_NullCoalesce:
- return 1;
- default:
- break;
- }
- return 0;
- }
- const char* Beefy::BfGetOpName(BfBinaryOp binOp)
- {
- switch (binOp)
- {
- case BfBinaryOp_None: return "";
- case BfBinaryOp_Add: return "+";
- case BfBinaryOp_Subtract: return "-";
- case BfBinaryOp_Multiply: return "*";
- case BfBinaryOp_Divide: return "\\";
- case BfBinaryOp_Modulus: return "%";
- case BfBinaryOp_BitwiseAnd: return "&";
- case BfBinaryOp_BitwiseOr: return "|";
- case BfBinaryOp_ExclusiveOr: return "^";
- case BfBinaryOp_LeftShift: return "<<";
- case BfBinaryOp_RightShift: return ">>";
- case BfBinaryOp_Equality: return "==";
- case BfBinaryOp_InEquality: return "!=";
- case BfBinaryOp_GreaterThan: return ">";
- case BfBinaryOp_LessThan: return "<";
- case BfBinaryOp_GreaterThanOrEqual: return ">=";
- case BfBinaryOp_LessThanOrEqual: return "<=";
- case BfBinaryOp_Compare: return "<=>";
- case BfBinaryOp_ConditionalAnd: return "&&";
- case BfBinaryOp_ConditionalOr: return "||";
- case BfBinaryOp_NullCoalesce: return "&&";
- case BfBinaryOp_Is: return "is";
- case BfBinaryOp_As: return "as";
- default: return "???";
- }
- }
- const char* Beefy::BfGetOpName(BfUnaryOp unaryOp)
- {
- switch (unaryOp)
- {
- case BfUnaryOp_None: return "";
- case BfUnaryOp_AddressOf: return "&";
- case BfUnaryOp_Dereference: return "*";
- case BfUnaryOp_Negate: return "-";
- case BfUnaryOp_Not: return "!";
- case BfUnaryOp_Positive: return "+";
- case BfUnaryOp_InvertBits: return "~";
- case BfUnaryOp_Increment: return "++";
- case BfUnaryOp_Decrement: return "--";
- case BfUnaryOp_PostIncrement: return "++";
- case BfUnaryOp_PostDecrement: return "--";
- case BfUnaryOp_Ref: return "ref";
- case BfUnaryOp_Out: return "out";
- case BfUnaryOp_Mut: return "mut";
- case BfUnaryOp_Params: return "params";
- default: return "???";
- }
- }
- BfInlineAsmInstruction::AsmArg::AsmArg()
- : mType(ARGTYPE_Immediate)
- , mMemFlags(0)
- , mInt(0)
- , mAdjRegScalar(1)
- {}
- #pragma warning(disable:4996)
- String BfInlineAsmInstruction::AsmArg::ToString()
- {
- String s;
- if (!mSizePrefix.empty())
- {
- s += mSizePrefix;
- s += " ptr ";
- }
- if (!mSegPrefix.empty())
- {
- s += mSegPrefix;
- s += ":";
- }
- switch(mType)
- {
- case ARGTYPE_Immediate:
- {
- char buf[64];
- sprintf(buf, "%d", mInt);
- s += buf;
- }
- break;
- case ARGTYPE_FloatReg:
- {
- char buf[64];
- sprintf(buf, "st(%d)", mInt);
- s += buf;
- }
- break;
- case ARGTYPE_IntReg:
- {
- s += mReg;
- }
- break;
- case ARGTYPE_Memory:
- {
- s += "[";
- if (mMemFlags & ARGMEMF_BaseReg)
- {
- s += mReg;
- if (mMemFlags != ARGMEMF_BaseReg)
- s += " + ";
- }
- if (mMemFlags & ARGMEMF_AdjReg)
- {
- s += mAdjReg;
- if (mAdjRegScalar != 1)
- {
- char buf[64];
- sprintf(buf, "%d", mAdjRegScalar);
- s += "*";
- s += buf;
- }
- if (mMemFlags & ARGMEMF_ImmediateDisp)
- s += " + ";
- }
- if (mMemFlags & ARGMEMF_ImmediateDisp)
- {
- char buf[64];
- sprintf(buf, "%d", mInt);
- s += buf;
- }
- s += "]";
- if (!mMemberSuffix.empty())
- {
- s += ".";
- s += mMemberSuffix;
- }
- }
- break;
- }
- return s;
- }
- BfInlineAsmInstruction::AsmInst::AsmInst()
- : mDebugLine(0)
- {}
- String BfInlineAsmInstruction::AsmInst::ToString()
- {
- String s;
- if (!mLabel.empty())
- {
- s += mLabel;
- s += ": ";
- }
- for (auto const& p : mOpPrefixes)
- {
- s += p;
- s += " ";
- }
- s += mOpCode;
- s += " ";
- for (int i=0; i<(int)mArgs.size(); ++i)
- {
- if (i > 0)
- s += ", ";
- s += mArgs[i].ToString();
- }
- return s;
- }
|