1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820 |
- #include "BeefySysLib/util/AllocDebug.h"
- #include "BfCompiler.h"
- #include "BfParser.h"
- #include "BfDefBuilder.h"
- #include "BfMangler.h"
- #include "BfConstResolver.h"
- #include "BfModule.h"
- #include "BeefySysLib/util/BeefPerf.h"
- #pragma warning(disable:4996)
- #pragma warning(disable:4267)
- USING_NS_BF;
- //void Beefy::DbgCheckType(llvm::Type* checkType)
- //{
- //#ifdef _DEBUG
- // /*while (auto ptrType = llvm::dyn_cast<llvm::PointerType>(checkType))
- // {
- // checkType = ptrType->getElementType();
- // }
- //
- // auto structType = llvm::dyn_cast<llvm::StructType>(checkType);
- // if (structType != NULL)
- // {
- // auto stringRef = structType->getName();
- // BF_ASSERT(strncmp(stringRef.data(), "DEAD", 4) != 0);
- // }*/
- //#endif
- //}
- void BfTypedValue::DbgCheckType() const
- {
- /*if (mType != NULL)
- {
- auto structType = llvm::dyn_cast<llvm::StructType>(mType->mIRType);
- if (structType != NULL)
- {
- auto stringRef = structType->getName();
- BF_ASSERT(strncmp(stringRef.data(), "DEAD", 4) != 0);
- }
- }*/
-
- #ifdef _DEBUG
- /*if (mValue != NULL)
- {
- auto checkType = mValue->getType();
- Beefy::DbgCheckType(checkType);
- }*/
- #endif
- }
- bool BfTypedValue::IsValuelessType() const
- {
- return mType->IsValuelessType();
- }
- //////////////////////////////////////////////////////////////////////////
- void BfDependencyMap::AddUsedBy(BfType* dependentType, BfDependencyMap::DependencyDependencyFlag flags)
- {
- BF_ASSERT(dependentType != NULL);
- BF_ASSERT(dependentType->mRevision != -1);
-
- //auto itr = mTypeSet.insert(BfDependencyMap::TypeMap::value_type(dependentType, DependencyEntry(dependentType->mRevision, flags)));
- //if (!itr.second)
- DependencyEntry* dependencyEntry = NULL;
- if (mTypeSet.TryAddRaw(dependentType, NULL, &dependencyEntry))
- {
- dependencyEntry->mRevision = dependentType->mRevision;
- dependencyEntry->mFlags = flags;
- }
- else
- {
- if (dependencyEntry->mRevision != dependentType->mRevision)
- {
- dependencyEntry->mRevision = dependentType->mRevision;
- dependencyEntry->mFlags = flags;
- }
- else
- {
- dependencyEntry->mFlags = (BfDependencyMap::DependencyDependencyFlag)(dependencyEntry->mFlags | flags);
- }
- }
- }
- bool BfDependencyMap::IsEmpty()
- {
- return mTypeSet.size() == 0;
- }
- BfDependencyMap::TypeMap::iterator BfDependencyMap::begin()
- {
- return mTypeSet.begin();
- }
- BfDependencyMap::TypeMap::iterator BfDependencyMap::end()
- {
- return mTypeSet.end();
- }
- BfDependencyMap::TypeMap::iterator BfDependencyMap::erase(BfDependencyMap::TypeMap::iterator& itr)
- {
- return mTypeSet.Remove(itr);
- }
- //////////////////////////////////////////////////////////////////////////
- BfFieldDef* BfFieldInstance::GetFieldDef()
- {
- if (mFieldIdx == -1)
- return NULL;
- return mOwner->mTypeDef->mFields[mFieldIdx];
- }
- //////////////////////////////////////////////////////////////////////////
- BfType::BfType()
- {
- mTypeId = -1;
- mContext = NULL;
- mRevision = -1;
-
- //mLastUsedRevision = -1;
-
- mDefineState = BfTypeDefineState_Undefined;
- //mDICallbackVH = NULL;
- //mInnerDICallbackVH = NULL;
- mRebuildFlags = BfTypeRebuildFlag_None;
- mAlign = -1;
- mSize = -1;
- //mDICallbackVH = NULL;
- //mInnerDICallbackVH = NULL;
- mDirty = true;
- }
- BfModule* BfType::GetModule()
- {
- if (mContext->mCompiler->mOptions.mCompileOnDemandKind == BfCompileOnDemandKind_AlwaysInclude)
- return mContext->mScratchModule;
- else
- return mContext->mUnreifiedModule;
- }
- BfTypeInstance* BfType::FindUnderlyingTypeInstance()
- {
- auto typeInstance = ToTypeInstance();
- if (typeInstance != NULL)
- return typeInstance;
- auto underlyingType = GetUnderlyingType();
- while (underlyingType != NULL)
- {
- auto underlyingTypeInst = underlyingType->ToTypeInstance();
- if (underlyingTypeInst != NULL)
- return underlyingTypeInst;
- underlyingType = underlyingType->GetUnderlyingType();
- }
- return NULL;
- }
- void BfType::ReportMemory(MemReporter* memReporter)
- {
- memReporter->Add(sizeof(BfType));
- }
- //////////////////////////////////////////////////////////////////////////
- BfNonGenericMethodRef::BfNonGenericMethodRef(BfMethodInstance* methodInstance)
- {
- *this = methodInstance;
- }
- BfNonGenericMethodRef::operator BfMethodInstance* () const
- {
- if (mTypeInstance == NULL)
- return NULL;
- if (mMethodNum < 0)
- return NULL;
- auto& methodSpecializationGroup = mTypeInstance->mMethodInstanceGroups[mMethodNum];
- BF_ASSERT(methodSpecializationGroup.mDefault != NULL);
- return methodSpecializationGroup.mDefault;
- }
- BfMethodInstance* BfNonGenericMethodRef::operator->() const
- {
- return *this;
- }
- BfNonGenericMethodRef& BfNonGenericMethodRef::operator=(BfMethodInstance* methodInstance)
- {
- if (methodInstance == NULL)
- {
- mTypeInstance = NULL;
- mMethodNum = 0;
- }
- else
- {
- mTypeInstance = methodInstance->mMethodInstanceGroup->mOwner;
- mMethodNum = methodInstance->mMethodInstanceGroup->mMethodIdx;
- BF_ASSERT(methodInstance->GetNumGenericArguments() == 0);
- mSignatureHash = (int)mTypeInstance->mTypeDef->mSignatureHash;
- }
- return *this;
- }
- bool BfNonGenericMethodRef::operator==(const BfNonGenericMethodRef& methodRef) const
- {
- bool eq = ((methodRef.mKind == mKind) &&
- (methodRef.mTypeInstance == mTypeInstance) &&
- (methodRef.mMethodNum == mMethodNum));
- if (eq)
- {
- BF_ASSERT((methodRef.mSignatureHash == mSignatureHash) || (methodRef.mSignatureHash == 0) || (mSignatureHash == 0));
- }
- return eq;
- }
- bool BfNonGenericMethodRef::operator==(BfMethodInstance* methodInstance) const
- {
- if (mTypeInstance != methodInstance->GetOwner())
- return false;
- return methodInstance == (BfMethodInstance*)*this;
- }
- size_t BfNonGenericMethodRef::Hash::operator()(const BfNonGenericMethodRef& val) const
- {
- return (val.mTypeInstance->mTypeId << 10) ^ val.mMethodNum;
- }
- //////////////////////////////////////////////////////////////////////////
- BfMethodRef::BfMethodRef(BfMethodInstance* methodInstance)
- {
- *this = methodInstance;
- }
- BfMethodRef::operator BfMethodInstance* () const
- {
- if (mTypeInstance == NULL)
- return NULL;
- if (mMethodNum < 0)
- return NULL;
- auto& methodSpecializationGroup = mTypeInstance->mMethodInstanceGroups[mMethodNum];
- if (mMethodGenericArguments.size() != 0)
- {
- bool isSpecialied = false;
- int paramIdx = 0;
- for (auto genericArg : mMethodGenericArguments)
- {
- if (!genericArg->IsGenericParam())
- {
- isSpecialied = true;
- break;
- }
-
- auto genericParam = (BfGenericParamType*)genericArg;
- if ((genericParam->mGenericParamKind != BfGenericParamKind_Method) || (genericParam->mGenericParamIdx != paramIdx))
- {
- isSpecialied = true;
- break;
- }
- paramIdx++;
- }
- if (isSpecialied)
- {
- BfMethodInstance** methodInstancePtr = NULL;
- if (methodSpecializationGroup.mMethodSpecializationMap->TryGetValue(mMethodGenericArguments, &methodInstancePtr))
- return *methodInstancePtr;
- return NULL;
- }
- }
- BF_ASSERT(methodSpecializationGroup.mDefault != NULL);
- return methodSpecializationGroup.mDefault;
- }
- BfMethodInstance* BfMethodRef::operator->() const
- {
- return *this;
- }
- BfMethodRef& BfMethodRef::operator=(BfMethodInstance* methodInstance)
- {
- if (methodInstance == NULL)
- {
- mTypeInstance = NULL;
- mMethodNum = 0;
- mMethodRefFlags = BfMethodRefFlag_None;
- }
- else
- {
- mTypeInstance = methodInstance->mMethodInstanceGroup->mOwner;
- mMethodNum = methodInstance->mMethodInstanceGroup->mMethodIdx;
- if (methodInstance->mMethodInfoEx != NULL)
- {
- mMethodGenericArguments.Clear();
- for (auto type : methodInstance->mMethodInfoEx->mMethodGenericArguments)
- mMethodGenericArguments.Add(type);
- }
- mSignatureHash = (int)mTypeInstance->mTypeDef->mSignatureHash;
- if (methodInstance->mAlwaysInline)
- mMethodRefFlags = BfMethodRefFlag_AlwaysInclude;
- else
- mMethodRefFlags = BfMethodRefFlag_None;
- }
- return *this;
- }
- bool BfMethodRef::operator==(const BfMethodRef& methodRef) const
- {
- bool eq = ((methodRef.mKind == mKind) &&
- (methodRef.mTypeInstance == mTypeInstance) &&
- (methodRef.mMethodNum == mMethodNum) &&
- (methodRef.mMethodGenericArguments == mMethodGenericArguments) &&
- (methodRef.mMethodRefFlags == mMethodRefFlags));
- if (eq)
- {
- BF_ASSERT((methodRef.mSignatureHash == mSignatureHash) || (methodRef.mSignatureHash == 0) || (mSignatureHash == 0));
- }
- return eq;
- }
- bool BfMethodRef::operator==(BfMethodInstance* methodInstance) const
- {
- if (mTypeInstance != methodInstance->GetOwner())
- return false;
- return methodInstance == (BfMethodInstance*)*this;
- }
- size_t BfMethodRef::Hash::operator()(const BfMethodRef& val) const
- {
- return (val.mTypeInstance->mTypeId << 10) ^ (val.mMethodNum << 1) ^ (int)(val.mMethodRefFlags);
- }
- //////////////////////////////////////////////////////////////////////////
- BfFieldRef::BfFieldRef(BfTypeInstance* typeInst, BfFieldDef* fieldDef)
- {
- mTypeInstance = typeInst;
- mFieldIdx = fieldDef->mIdx;
- }
- BfFieldRef::BfFieldRef(BfFieldInstance* fieldInstance)
- {
- mTypeInstance = fieldInstance->mOwner;
- mFieldIdx = fieldInstance->mFieldIdx;
- }
- BfFieldRef::operator BfFieldInstance*() const
- {
- BF_ASSERT(!mTypeInstance->IsDataIncomplete());
- return &mTypeInstance->mFieldInstances[mFieldIdx];
- }
- BfFieldRef::operator BfFieldDef*() const
- {
- return mTypeInstance->mTypeDef->mFields[mFieldIdx];
- }
- //////////////////////////////////////////////////////////////////////////
- BfPropertyRef::BfPropertyRef(BfTypeInstance* typeInst, BfPropertyDef* propDef)
- {
- mTypeInstance = typeInst;
- mPropIdx = propDef->mIdx;
- }
- BfPropertyRef::operator BfPropertyDef*() const
- {
- return mTypeInstance->mTypeDef->mProperties[mPropIdx];
- }
- //////////////////////////////////////////////////////////////////////////
- /*BfMethodInstance* BfTypeInstance::GetVTableMethodInstance(int vtableIdx)
- {
- auto& methodSpecializationGroup = mVirtualMethodTable[vtableIdx].mTypeInstance->mMethodInstanceGroups[mVirtualMethodTable[vtableIdx].mMethodNum];
- return &methodSpecializationGroup.mMethodSpecializationMap.begin()->second;
- }*/
- static int gDelIdx = 0;
- BfType::~BfType()
- {
- BfLogSys(mContext->mSystem, "~BfType %p\n", this);
- /*gDelIdx++;
- auto typeInst = ToTypeInstance();
- OutputDebugStrF("%d Deleting %08X type %s\n", gDelIdx, this, (typeInst != NULL) ? typeInst->mTypeDef->mName.c_str() : "");*/
- //delete mDICallbackVH;
- //delete mInnerDICallbackVH;
- }
- BfFieldInstance::~BfFieldInstance()
- {
- delete mCustomAttributes;
- }
- BfType* BfFieldInstance::GetResolvedType()
- {
- return mResolvedType;
- /*if (mType == NULL)
- return NULL;
- if (!mType->IsGenericParam())
- return mType;
- if (!mOwner->IsGenericTypeInstance())
- return mType;
- auto genericParamType = (BfGenericParamType*)mType;
- auto genericTypeInst = (BfGenericTypeInstance*)mOwner;
- if (genericTypeInst->mIsUnspecialized)
- return mType;
- if (genericParamType->mGenericParamKind == BfGenericParamKind_Type)
- return genericTypeInst->mTypeGenericArguments[genericParamType->mGenericParamIdx];
- return mType;*/
- }
- void BfFieldInstance::SetResolvedType(BfType* type)
- {
- mResolvedType = type;
- }
- BfMethodCustomAttributes::~BfMethodCustomAttributes()
- {
- delete mCustomAttributes;
- delete mReturnCustomAttributes;
- for (auto paramCustomAttributes : mParamCustomAttributes)
- delete paramCustomAttributes;
- }
- BfMethodInstance* BfMethodParam::GetDelegateParamInvoke()
- {
- BF_ASSERT(mResolvedType->IsDelegate() || mResolvedType->IsFunction());
- auto bfModule = BfModule::GetModuleFor(mResolvedType);
- BfMethodInstance* invokeMethodInstance = bfModule->GetRawMethodInstanceAtIdx(mResolvedType->ToTypeInstance(), 0, "Invoke");
- return invokeMethodInstance;
- }
- BfMethodInfoEx::~BfMethodInfoEx()
- {
- for (auto genericParam : mGenericParams)
- genericParam->Release();
- delete mMethodCustomAttributes;
- delete mClosureInstanceInfo;
- }
- BfMethodInstance::~BfMethodInstance()
- {
- if (mHasMethodRefType)
- {
- auto module = GetOwner()->mModule;
- if (!module->mContext->mDeleting)
- {
- auto methodRefType = module->CreateMethodRefType(this);
- module->mContext->DeleteType(methodRefType);
- }
- }
- if (mMethodProcessRequest != NULL)
- {
- BF_ASSERT(mMethodProcessRequest->mMethodInstance == this);
- mMethodProcessRequest->mMethodInstance = NULL;
- }
-
- if (mHotMethod != NULL)
- {
- mHotMethod->mFlags = (BfHotDepDataFlags)(mHotMethod->mFlags & ~BfHotDepDataFlag_IsBound);
- mHotMethod->Deref();
- }
- delete mMethodInfoEx;
- }
- void BfMethodInstance::UndoDeclaration(bool keepIRFunction)
- {
-
- if (mMethodInfoEx != NULL)
- {
- for (auto genericParam : mMethodInfoEx->mGenericParams)
- genericParam->Release();
- mMethodInfoEx->mGenericParams.Clear();
- delete mMethodInfoEx->mMethodCustomAttributes;
- mMethodInfoEx->mMethodCustomAttributes = NULL;
- mMethodInfoEx->mGenericTypeBindings.Clear();
- }
- mReturnType = NULL;
- if (!keepIRFunction)
- mIRFunction = BfIRValue();
- mParams.Clear();
-
- mDefaultValues.Clear();
- if (mMethodProcessRequest != NULL)
- {
- BF_ASSERT(mMethodProcessRequest->mMethodInstance == this);
- mMethodProcessRequest->mMethodInstance = NULL;
- }
- mHasBeenProcessed = false;
- mIsUnspecialized = false;
- mIsUnspecializedVariation = false;
- mDisallowCalling = false;
- mIsIntrinsic = false;
- mHasFailed = false;
- mFailedConstraints = false;
- }
- BfTypeInstance* BfMethodInstance::GetOwner()
- {
- return mMethodInstanceGroup->mOwner;
- }
- BfModule * BfMethodInstance::GetModule()
- {
- return mMethodInstanceGroup->mOwner->mModule;
- }
- bool Beefy::BfMethodInstance::IsSpecializedGenericMethod()
- {
- return (mMethodInfoEx != NULL) && (mMethodInfoEx->mGenericParams.size() != 0) && (!mIsUnspecialized);
- }
- bool Beefy::BfMethodInstance::IsSpecializedGenericMethodOrType()
- {
- if ((mMethodInfoEx != NULL) && (mMethodInfoEx->mGenericParams.size() != 0) && (!mIsUnspecialized))
- return true;
- auto owner = GetOwner();
- if (!owner->IsGenericTypeInstance())
- return false;
- BfGenericTypeInstance* genericTypeInstance = (BfGenericTypeInstance*)owner;
- return !genericTypeInstance->mIsUnspecialized;
- }
- bool BfMethodInstance::IsSpecializedByAutoCompleteMethod()
- {
- if (mMethodInstanceGroup->mOwner->IsSpecializedByAutoCompleteMethod())
- return true;
- if (mMethodInfoEx != NULL)
- {
- for (auto methodArg : mMethodInfoEx->mMethodGenericArguments)
- {
- // If we are specialized by an autocompleted method reference
- if (methodArg->IsMethodRef())
- {
- auto methodRefType = (BfMethodRefType*)methodArg;
- if (methodRefType->mIsAutoCompleteMethod)
- return true;
- }
- }
- }
- return false;
- }
- bool BfMethodInstance::HasParamsArray()
- {
- if (mParams.size() == 0)
- return false;
- return GetParamKind((int)mParams.size() - 1) == BfParamKind_Params;
- }
- bool BfMethodInstance::HasStructRet()
- {
- return (mReturnType->IsComposite()) && (!mReturnType->IsValuelessType());
- }
- bool BfMethodInstance::HasSelf()
- {
- if (mReturnType->IsSelf())
- return true;
- for (int paramIdx = 0; paramIdx < GetParamCount(); paramIdx++)
- if (GetParamType(paramIdx)->IsSelf())
- return true;
- return false;
- }
- bool BfMethodInstance::IsSkipCall(bool bypassVirtual)
- {
- if ((mMethodDef->mIsSkipCall) &&
- ((!mMethodDef->mIsVirtual) || (bypassVirtual)))
- return true;
- return false;
- }
- bool BfMethodInstance::AlwaysInline()
- {
- return mAlwaysInline;
- }
- BfImportCallKind BfMethodInstance::GetImportCallKind()
- {
- if (mMethodDef->mImportKind != BfImportKind_Dynamic)
- return BfImportCallKind_None;
- if ((mHotMethod != NULL) && ((mHotMethod->mFlags & BfHotDepDataFlag_IsOriginalBuild) == 0))
- return BfImportCallKind_GlobalVar_Hot;
- return BfImportCallKind_GlobalVar;
- }
- bool BfMethodInstance::IsTestMethod()
- {
- return (mMethodInfoEx != NULL) && (mMethodInfoEx->mMethodCustomAttributes != NULL) && (mMethodInfoEx->mMethodCustomAttributes->mCustomAttributes != NULL) &&
- (mMethodInfoEx->mMethodCustomAttributes->mCustomAttributes != NULL) && (mMethodInfoEx->mMethodCustomAttributes->mCustomAttributes->Contains(GetOwner()->mModule->mCompiler->mTestAttributeTypeDef));
- }
- bool BfMethodInstance::HasThis()
- {
- if (mMethodDef->mIsStatic)
- return false;
- if ((mMethodInfoEx != NULL) && (mMethodInfoEx->mClosureInstanceInfo != NULL) && (mMethodInfoEx->mClosureInstanceInfo->mThisOverride != NULL))
- return !mMethodInfoEx->mClosureInstanceInfo->mThisOverride->IsValuelessType();
- return (!mMethodInstanceGroup->mOwner->IsValuelessType());
- }
- int BfMethodInstance::GetParamCount()
- {
- return (int)mParams.size();
- }
- int BfMethodInstance::GetImplicitParamCount()
- {
- if ((mMethodInfoEx != NULL) && (mMethodInfoEx->mClosureInstanceInfo != NULL) && (mMethodDef->mIsLocalMethod))
- return (int)mMethodInfoEx->mClosureInstanceInfo->mCaptureEntries.size();
- return 0;
- }
- String BfMethodInstance::GetParamName(int paramIdx)
- {
- if (paramIdx == -1)
- {
- BF_ASSERT(!mMethodDef->mIsStatic);
- return "this";
- }
- if ((mMethodInfoEx != NULL) && (mMethodInfoEx->mClosureInstanceInfo != NULL) && (mMethodDef->mIsLocalMethod))
- {
- if (paramIdx < (int)mMethodInfoEx->mClosureInstanceInfo->mCaptureEntries.size())
- return mMethodInfoEx->mClosureInstanceInfo->mCaptureEntries[paramIdx].mName;
- }
- BfMethodParam* methodParam = &mParams[paramIdx];
- BfParameterDef* paramDef = mMethodDef->mParams[methodParam->mParamDefIdx];
- if (methodParam->mDelegateParamIdx != -1)
- {
- BfMethodInstance* invokeMethodInstance = methodParam->GetDelegateParamInvoke();
- if (methodParam->mDelegateParamNameCombine)
- return paramDef->mName + "__" + invokeMethodInstance->GetParamName(methodParam->mDelegateParamIdx);
- else
- return invokeMethodInstance->GetParamName(methodParam->mDelegateParamIdx);
- }
- return paramDef->mName;
- }
- BfType* BfMethodInstance::GetParamType(int paramIdx, bool useResolvedType)
- {
- if (paramIdx == -1)
- {
- if ((mMethodInfoEx != NULL) && (mMethodInfoEx->mClosureInstanceInfo != NULL) && (mMethodInfoEx->mClosureInstanceInfo->mThisOverride != NULL))
- return mMethodInfoEx->mClosureInstanceInfo->mThisOverride;
- BF_ASSERT(!mMethodDef->mIsStatic);
- auto owner = mMethodInstanceGroup->mOwner;
- if ((owner->IsValueType()) && ((mMethodDef->mIsMutating) || (mMethodDef->mNoSplat)))
- return owner->mModule->CreatePointerType(owner);
- return owner;
- }
- BfMethodParam* methodParam = &mParams[paramIdx];
- if (methodParam->mDelegateParamIdx != -1)
- {
- BfMethodInstance* invokeMethodInstance = methodParam->GetDelegateParamInvoke();
- return invokeMethodInstance->GetParamType(methodParam->mDelegateParamIdx, true);
- }
- return methodParam->mResolvedType;
- }
- bool BfMethodInstance::GetParamIsSplat(int paramIdx)
- {
- if (paramIdx == -1)
- {
- BF_ASSERT(!mMethodDef->mIsStatic);
- auto owner = mMethodInstanceGroup->mOwner;
- if ((owner->IsValueType()) && (mMethodDef->mIsMutating || mMethodDef->mNoSplat))
- return false;
- return owner->mIsSplattable;
- }
- BfMethodParam* methodParam = &mParams[paramIdx];
- if (methodParam->mDelegateParamIdx != -1)
- {
- BfMethodInstance* invokeMethodInstance = methodParam->GetDelegateParamInvoke();
- return invokeMethodInstance->GetParamIsSplat(methodParam->mDelegateParamIdx);
- }
- return methodParam->mIsSplat;
- }
- BfParamKind BfMethodInstance::GetParamKind(int paramIdx)
- {
- BfMethodParam* methodParam = &mParams[paramIdx];
- if (methodParam->mParamDefIdx == -1)
- return BfParamKind_ImplicitCapture;
- BfParameterDef* paramDef = mMethodDef->mParams[methodParam->mParamDefIdx];
- if (methodParam->mDelegateParamIdx != -1)
- return BfParamKind_DelegateParam;
- return paramDef->mParamKind;
- }
- bool BfMethodInstance::WasGenericParam(int paramIdx)
- {
- BfMethodParam* methodParam = &mParams[paramIdx];
- return methodParam->mWasGenericParam;
- }
- bool BfMethodInstance::IsParamSkipped(int paramIdx)
- {
- BfType* paramType = GetParamType(paramIdx);
- if ((paramType->CanBeValuelessType()) && (paramType->IsDataIncomplete()))
- GetModule()->PopulateType(paramType, BfPopulateType_Data);
- if ((paramType->IsValuelessType()) && (!paramType->IsMethodRef()))
- return true;
- return false;
- }
- bool BfMethodInstance::IsImplicitCapture(int paramIdx)
- {
- BfMethodParam* methodParam = &mParams[paramIdx];
- if (methodParam->mParamDefIdx == -1)
- return true;
- return false;
- }
- BfExpression* BfMethodInstance::GetParamInitializer(int paramIdx)
- {
- BfMethodParam* methodParam = &mParams[paramIdx];
- if (methodParam->mParamDefIdx == -1)
- return NULL;
- BfParameterDef* paramDef = mMethodDef->mParams[methodParam->mParamDefIdx];
- if (paramDef->mParamDeclaration != NULL)
- return paramDef->mParamDeclaration->mInitializer;
- return NULL;
- }
- BfTypeReference* BfMethodInstance::GetParamTypeRef(int paramIdx)
- {
- BfMethodParam* methodParam = &mParams[paramIdx];
- if (methodParam->mParamDefIdx == -1)
- return NULL;
- BfParameterDef* paramDef = mMethodDef->mParams[methodParam->mParamDefIdx];
- if (paramDef->mParamDeclaration != NULL)
- return paramDef->mParamDeclaration->mTypeRef;
- return NULL;
- }
- BfIdentifierNode* BfMethodInstance::GetParamNameNode(int paramIdx)
- {
- if (paramIdx == -1)
- return NULL;
- if ((mMethodInfoEx != NULL) && (mMethodInfoEx->mClosureInstanceInfo != NULL) && (mMethodDef->mIsLocalMethod))
- {
- if (paramIdx < (int)mMethodInfoEx->mClosureInstanceInfo->mCaptureEntries.size())
- return mMethodInfoEx->mClosureInstanceInfo->mCaptureEntries[paramIdx].mNameNode;
- }
- BfMethodParam* methodParam = &mParams[paramIdx];
- BfParameterDef* paramDef = mMethodDef->mParams[methodParam->mParamDefIdx];
- if (paramDef->mParamDeclaration != NULL)
- return BfNodeDynCast<BfIdentifierNode>(paramDef->mParamDeclaration->mNameNode);
- // else if ((mClosureInstanceInfo != NULL) && (paramIdx < (int)mClosureInstanceInfo->mCaptureNodes.size()))
- // return mClosureInstanceInfo->mCaptureNodes[paramIdx];
- return NULL;
- }
- int BfMethodInstance::DbgGetVirtualMethodNum()
- {
- auto module = GetOwner()->mModule;
- int vDataVal = -1;
- if (mVirtualTableIdx != -1)
- {
- module->HadSlotCountDependency();
- int vDataIdx = -1;
- vDataIdx = 1 + module->mCompiler->mMaxInterfaceSlots;
- vDataIdx += module->mCompiler->GetDynCastVDataCount();
- if ((module->mCompiler->mOptions.mHasVDataExtender) && (module->mCompiler->IsHotCompile()))
- {
- auto typeInst = mMethodInstanceGroup->mOwner;
- int extMethodIdx = (mVirtualTableIdx - typeInst->GetBaseVTableSize()) - typeInst->GetOrigSelfVTableSize();
- if (extMethodIdx >= 0)
- {
- // Extension?
- int vExtOfs = typeInst->GetOrigBaseVTableSize();
- vDataVal = ((vDataIdx + vExtOfs + 1) << 20) | (extMethodIdx);
- }
- else
- {
- // Map this new virtual index back to the original index
- vDataIdx += (mVirtualTableIdx - typeInst->GetBaseVTableSize()) + typeInst->GetOrigBaseVTableSize();
- }
- }
- else
- {
- vDataIdx += mVirtualTableIdx;
- }
- if (vDataVal == -1)
- vDataVal = vDataIdx;
- }
- return vDataVal;
- }
- void BfMethodInstance::GetIRFunctionInfo(BfModule* module, BfIRType& returnType, SizedArrayImpl<BfIRType>& paramTypes, bool forceStatic)
- {
- if ((mMethodDef->mNoSplat) && (GetOwner()->GetLoweredType() != BfTypeCode_None))
- {
- NOP;
- }
- module->PopulateType(mReturnType);
- if (mReturnType->IsValuelessType())
- {
- auto voidType = module->GetPrimitiveType(BfTypeCode_None);
- returnType = module->mBfIRBuilder->MapType(voidType);
- }
- else if (mReturnType->IsComposite())
- {
- auto voidType = module->GetPrimitiveType(BfTypeCode_None);
- returnType = module->mBfIRBuilder->MapType(voidType);
- auto typeInst = mReturnType->ToTypeInstance();
- if (typeInst != NULL)
- {
- paramTypes.push_back(module->mBfIRBuilder->MapTypeInstPtr(typeInst));
- }
- else
- {
- auto ptrType = module->CreatePointerType(mReturnType);
- paramTypes.push_back(module->mBfIRBuilder->MapType(ptrType));
- }
- }
- else
- {
- returnType = module->mBfIRBuilder->MapType(mReturnType);
- }
- for (int paramIdx = -1; paramIdx < GetParamCount(); paramIdx++)
- {
- BfType* checkType = NULL;
- if (paramIdx == -1)
- {
- if ((mMethodDef->mIsStatic) || (forceStatic))
- continue;
- if (mIsClosure)
- {
- checkType = module->mCurMethodState->mClosureState->mClosureType;
- }
- else
- checkType = GetOwner();
- }
- else
- {
- checkType = GetParamType(paramIdx);
- }
- if ((paramIdx != -1) || (!mMethodDef->mNoSplat && !mMethodDef->mIsMutating))
- {
- auto loweredTypeCode = checkType->GetLoweredType();
- if (loweredTypeCode != BfTypeCode_None)
- checkType = module->GetPrimitiveType(loweredTypeCode);
- }
- if ((paramIdx == 0) && (GetParamName(0) == "this") && (checkType->IsPointer()))
- {
- // We don't actually pass a this pointer for mut methods in valueless structs
- auto underlyingType = checkType->GetUnderlyingType();
- module->PopulateType(underlyingType, BfPopulateType_Data);
- if (underlyingType->IsValuelessType())
- continue;
- }
- if (checkType->CanBeValuelessType())
- module->PopulateType(checkType, BfPopulateType_Data);
- if ((checkType->IsValuelessType()) && (!checkType->IsMethodRef()))
- continue;
- bool doSplat = true;
- if (checkType->IsMethodRef())
- {
- doSplat = true;
- }
- else if (mMethodDef->mNoSplat)
- {
- doSplat = false;
- }
- else
- {
- int splatCount = checkType->GetSplatCount();
- doSplat = ((checkType->IsSplattable()) && ((paramIdx != -1) || (!mMethodDef->mIsMutating)));
- if ((int)paramTypes.size() + splatCount > module->mCompiler->mOptions.mMaxSplatRegs)
- doSplat = false;
- }
- auto _AddType = [&](BfType* type)
- {
- if ((type->IsComposite()) || ((!doSplat) && (paramIdx == -1) && (type->IsTypedPrimitive())))
- {
- auto typeInst = type->ToTypeInstance();
- if (typeInst != NULL)
- paramTypes.push_back(module->mBfIRBuilder->MapTypeInstPtr(typeInst));
- else
- paramTypes.push_back(module->mBfIRBuilder->MapType(module->CreatePointerType(type)));
- }
- else
- {
- paramTypes.push_back(module->mBfIRBuilder->MapType(type));
- }
- };
- if (doSplat)
- {
- BfTypeUtils::SplatIterate([&](BfType* checkType)
- {
- _AddType(checkType);
- }, checkType);
- }
- else
- _AddType(checkType);
-
- }
- }
- int BfMethodInstance::GetIRFunctionParamCount(BfModule* module)
- {
- //TODO: This is dumb, do this better
- SizedArray<BfIRType, 8> params;
- BfIRType returnType;
- GetIRFunctionInfo(module, returnType, params);
- return (int)params.size();
- }
- bool BfMethodInstance::IsExactMatch(BfMethodInstance* other, bool ignoreImplicitParams, bool checkThis)
- {
- if (mReturnType != other->mReturnType)
- return false;
-
- int implicitParamCountA = ignoreImplicitParams ? GetImplicitParamCount() : 0;
- int implicitParamCountB = ignoreImplicitParams ? other->GetImplicitParamCount() : 0;
- if (checkThis)
- {
- if (other->mMethodDef->mIsStatic != mMethodDef->mIsStatic)
- {
- // If we are static and we have to match a non-static method, allow us to do so if we have an explicitly defined 'this' param that matches
- if (other->mMethodDef->mIsStatic)
- return false;
-
- if ((GetParamCount() > 0) && (GetParamName(0) == "this"))
- {
- auto thisType = GetParamType(0);
- auto otherThisType = other->GetParamType(-1);
- if (thisType != otherThisType)
- return false;
- implicitParamCountA++;
- }
- else
- {
- // Valueless types don't actually pass a 'this' anyway
- if (!other->GetOwner()->IsValuelessType())
- return false;
- }
- }
- }
- if (GetParamCount() - implicitParamCountA != other->GetParamCount() - implicitParamCountB)
- return false;
- for (int i = 0; i < (int)GetParamCount() - implicitParamCountA; i++)
- {
- auto paramA = GetParamType(i + implicitParamCountA);
- auto paramB = other->GetParamType(i + implicitParamCountB);
- if (paramA != paramB)
- return false;
- }
- return true;
- }
- bool BfMethodInstance::IsReifiedAndImplemented()
- {
- return mIsReified && mMethodInstanceGroup->IsImplemented();
- }
- BfMethodInfoEx* BfMethodInstance::GetMethodInfoEx()
- {
- if (mMethodInfoEx == NULL)
- mMethodInfoEx = new BfMethodInfoEx();
- return mMethodInfoEx;
- }
- void BfMethodInstance::ReportMemory(MemReporter* memReporter)
- {
- memReporter->BeginSection("MethodInstance");
- memReporter->Add(sizeof(BfMethodInstance));
- if (mMethodInfoEx != NULL)
- {
- memReporter->BeginSection("MethodInfoEx");
- memReporter->Add(sizeof(BfMethodInfoEx));
- if (!mMethodInfoEx->mGenericParams.IsEmpty())
- memReporter->AddVecPtr("GenericParams", mMethodInfoEx->mGenericParams, false);
- if (!mMethodInfoEx->mGenericTypeBindings.IsEmpty())
- memReporter->AddMap("GenericTypeBindings", mMethodInfoEx->mGenericTypeBindings, false);
- if (mMethodInfoEx->mMethodCustomAttributes != NULL)
- {
- if (mMethodInfoEx->mMethodCustomAttributes->mCustomAttributes != NULL)
- mMethodInfoEx->mMethodCustomAttributes->mCustomAttributes->ReportMemory(memReporter);
- }
- if (!mMethodInfoEx->mMethodGenericArguments.IsEmpty())
- memReporter->AddVec("MethodGenericArguments", mMethodInfoEx->mMethodGenericArguments, false);
- if (!mMethodInfoEx->mMangledName.IsEmpty())
- memReporter->AddStr("MangledName", mMethodInfoEx->mMangledName);
- memReporter->EndSection();
- }
-
- memReporter->AddVec("Params", mParams, false);
- if (!mDefaultValues.IsEmpty())
- memReporter->AddVec("DefaultValues", mDefaultValues, false);
-
- memReporter->EndSection();
- }
- void BfCustomAttributes::ReportMemory(MemReporter* memReporter)
- {
- memReporter->BeginSection("CustomAttributes");
- memReporter->Add(sizeof(BfCustomAttributes));
- memReporter->AddVec(mAttributes);
- memReporter->EndSection();
- }
- //////////////////////////////////////////////////////////////////////////
- BfModuleMethodInstance::BfModuleMethodInstance(BfMethodInstance* methodInstance)
- {
- mMethodInstance = methodInstance;
- mFunc = mMethodInstance->mIRFunction;
- // if (methodInstance->GetImportCallKind() == BfImportCallKind_Thunk)
- // {
- // auto declModule = methodInstance->mDeclModule;
- // BfIRValue* irFuncPtr = NULL;
- // if (declModule->mFuncReferences.TryGetValue(methodInstance, &irFuncPtr))
- // mFunc = *irFuncPtr;
- // }
- }
- //////////////////////////////////////////////////////////////////////////
- BfMethodRefType::~BfMethodRefType()
- {
- if (!mContext->mDeleting)
- BF_ASSERT(mMethodRef == NULL);
- }
- BfMethodInstanceGroup::~BfMethodInstanceGroup()
- {
- if (mRefCount != 0)
- {
- BF_ASSERT(mOwner->mModule->mContext->mDeleting);
- }
- delete mDefault;
- if (mMethodSpecializationMap != NULL)
- {
- for (auto& kv : *mMethodSpecializationMap)
- delete kv.mValue;
- delete mMethodSpecializationMap;
- }
- }
- //////////////////////////////////////////////////////////////////////////
- BfTypeInstance::~BfTypeInstance()
- {
- delete mCustomAttributes;
- delete mAttributeData;
- for (auto methodInst : mInternalMethods)
- delete methodInst;
- delete mHotTypeData;
- delete mConstHolder;
- }
- int BfTypeInstance::GetSplatCount()
- {
- if (IsValuelessType())
- return 0;
- if (!mIsSplattable)
- return 1;
- int splatCount = 0;
- BfTypeUtils::SplatIterate([&](BfType* checkType) { splatCount++; }, this);
- return splatCount;
- }
- bool BfTypeInstance::IsString()
- {
- return mTypeDef == mContext->mCompiler->mStringTypeDef;
- }
- int BfTypeInstance::GetOrigVTableSize()
- {
- if (!mModule->mCompiler->mOptions.mHasVDataExtender)
- {
- BF_ASSERT(mHotTypeData == NULL);
- return mVirtualMethodTableSize;
- }
- if (mHotTypeData != NULL)
- {
- // When we have a pending data change, treat it as a fresh vtable
- if ((!mHotTypeData->mPendingDataChange) && (mHotTypeData->mVTableOrigLength != -1))
- return mHotTypeData->mVTableOrigLength;
- }
- if (mBaseType != NULL)
- return mBaseType->GetOrigVTableSize() + (mVirtualMethodTableSize - mBaseType->mVirtualMethodTableSize);
- return mVirtualMethodTableSize;
- }
- int BfTypeInstance::GetSelfVTableSize()
- {
- if (mBaseType != NULL)
- {
- BF_ASSERT(mBaseType->mVirtualMethodTableSize > 0);
- return mVirtualMethodTableSize - mBaseType->mVirtualMethodTableSize;
- }
- return mVirtualMethodTableSize;
- }
- int BfTypeInstance::GetOrigSelfVTableSize()
- {
- if (mBaseType != NULL)
- return GetOrigVTableSize() - GetOrigBaseVTableSize();
- return GetOrigVTableSize();
- }
- int BfTypeInstance::GetBaseVTableSize()
- {
- if (mBaseType != NULL)
- return mBaseType->mVirtualMethodTableSize;
- return 0;
- }
- int BfTypeInstance::GetOrigBaseVTableSize()
- {
- if (mBaseType != NULL)
- return mBaseType->GetOrigVTableSize();
- return 0;
- }
- int BfTypeInstance::GetIFaceVMethodSize()
- {
- int maxIFaceIdx = 0;
- auto checkTypeInstance = this;
- while (checkTypeInstance != NULL)
- {
- for (auto&& interfaceEntry : checkTypeInstance->mInterfaces)
- {
- maxIFaceIdx = BF_MAX(maxIFaceIdx, interfaceEntry.mStartVirtualIdx + interfaceEntry.mInterfaceType->mVirtualMethodTableSize);
- }
- checkTypeInstance = checkTypeInstance->mBaseType;
- }
- return maxIFaceIdx;
- }
- BfType* BfTypeInstance::GetUnionInnerType(bool* wantSplat)
- {
- if (wantSplat != NULL)
- *wantSplat = false;
- if (!mIsUnion)
- return NULL;
- int unionSize = 0;
- BfType* unionInnerType = NULL;
- bool makeRaw = false;
- for (int fieldIdx = 0; fieldIdx < (int)mFieldInstances.size(); fieldIdx++)
- {
- auto fieldInstance = (BfFieldInstance*)&mFieldInstances[fieldIdx];
- auto fieldDef = fieldInstance->GetFieldDef();
- BfType* checkInnerType = NULL;
- if (fieldDef == NULL)
- continue;
- if ((fieldDef->mIsConst) && (fieldInstance->mIsEnumPayloadCase))
- {
- BF_ASSERT(mIsUnion);
- checkInnerType = fieldInstance->mResolvedType;
- }
- if (fieldInstance->mDataIdx >= 0)
- {
- checkInnerType = fieldInstance->mResolvedType;
- }
- if (checkInnerType != NULL)
- {
- mModule->PopulateType(checkInnerType);
- if (checkInnerType->mSize > unionSize)
- unionSize = checkInnerType->mSize;
- if ((!checkInnerType->IsValuelessType()) && (checkInnerType != unionInnerType))
- {
- if (unionInnerType == NULL)
- {
- unionInnerType = checkInnerType;
- }
- else
- {
- if (checkInnerType->mSize > unionInnerType->mSize)
- {
- bool needsMemberCasting = false;
- if (!mModule->AreSplatsCompatible(checkInnerType, unionInnerType, &needsMemberCasting))
- {
- unionInnerType = NULL;
- makeRaw = true;
- }
- else
- {
- unionInnerType = checkInnerType;
- }
- }
- else
- {
- bool needsMemberCasting = false;
- if (!mModule->AreSplatsCompatible(unionInnerType, checkInnerType, &needsMemberCasting))
- {
- unionInnerType = NULL;
- makeRaw = true;
- }
- }
- }
- }
- }
- }
- unionSize = BF_ALIGN(unionSize, mInstAlign);
- BF_ASSERT(unionInnerType != this);
- // Don't allow a float for the inner type -- to avoid invalid loading invalid FP bit patterns during copies
- if ((unionInnerType != NULL) && (!makeRaw))
- {
- if (wantSplat != NULL)
- *wantSplat = true;
- }
- else
- {
- switch (unionSize)
- {
- case 0: return mModule->CreateSizedArrayType(mModule->GetPrimitiveType(BfTypeCode_Int8), 0);
- case 1: return mModule->GetPrimitiveType(BfTypeCode_Int8);
- case 2: if (mInstAlign >= 2) return mModule->GetPrimitiveType(BfTypeCode_Int16);
- case 4: if (mInstAlign >= 4) return mModule->GetPrimitiveType(BfTypeCode_Int32);
- case 8: if (mInstAlign >= 8) return mModule->GetPrimitiveType(BfTypeCode_Int64);
- }
- if ((unionSize % 8 == 0) && (mInstAlign >= 8))
- return mModule->CreateSizedArrayType(mModule->GetPrimitiveType(BfTypeCode_Int64), unionSize / 8);
- if ((unionSize % 4 == 0) && (mInstAlign >= 4))
- return mModule->CreateSizedArrayType(mModule->GetPrimitiveType(BfTypeCode_Int32), unionSize / 4);
- if ((unionSize % 2 == 0) && (mInstAlign >= 2))
- return mModule->CreateSizedArrayType(mModule->GetPrimitiveType(BfTypeCode_Int16), unionSize / 2);
- return mModule->CreateSizedArrayType(mModule->GetPrimitiveType(BfTypeCode_Int8), unionSize);
- }
- return unionInnerType;
- }
- BfPrimitiveType* BfTypeInstance::GetDiscriminatorType(int* outDataIdx)
- {
- BF_ASSERT(IsPayloadEnum());
- auto& fieldInstance = mFieldInstances.back();
- BF_ASSERT(fieldInstance.GetFieldDef() == NULL);
- if (fieldInstance.mResolvedType == NULL)
- {
- BF_ASSERT(IsIncomplete());
- // Use Int64 as a placeholder until we determine the correct type...
- return mModule->GetPrimitiveType(BfTypeCode_Int64);
- }
- BF_ASSERT(fieldInstance.mResolvedType != NULL);
- BF_ASSERT(fieldInstance.mResolvedType->IsPrimitiveType());
- if (outDataIdx != NULL)
- *outDataIdx = fieldInstance.mDataIdx;
- return (BfPrimitiveType*)fieldInstance.mResolvedType;
- }
- BfTypeCode BfTypeInstance::GetLoweredType()
- {
- if ((mTypeDef->mTypeCode != BfTypeCode_Struct) || (mIsSplattable))
- return BfTypeCode_None;
-
- switch (mInstSize)
- {
- case 1: return BfTypeCode_Int8;
- case 2: return BfTypeCode_Int16;
- case 4: return BfTypeCode_Int32;
- case 8: if (mModule->mSystem->mPtrSize == 8) return BfTypeCode_Int64;
- }
- return BfTypeCode_None;
- }
- bool BfTypeInstance::HasEquivalentLayout(BfTypeInstance* compareTo)
- {
- if (mFieldInstances.size() != compareTo->mFieldInstances.size())
- return false;
- for (int fieldIdx = 0; fieldIdx < (int)mFieldInstances.size(); fieldIdx++)
- {
- auto fieldInstance = &mFieldInstances[fieldIdx];
- auto otherFieldInstance = &compareTo->mFieldInstances[fieldIdx];
- if (fieldInstance->mResolvedType != otherFieldInstance->mResolvedType)
- return false;
- }
- return true;
- }
- BfIRConstHolder* BfTypeInstance::GetOrCreateConstHolder()
- {
- if (mConstHolder == NULL)
- mConstHolder = new BfIRConstHolder(mModule);
- return mConstHolder;
- }
- BfIRValue BfTypeInstance::CreateConst(BfConstant* fromConst, BfIRConstHolder* fromHolder)
- {
- if (mConstHolder == NULL)
- mConstHolder = new BfIRConstHolder(mModule);
- return mConstHolder->CreateConst(fromConst, fromHolder);
- }
- bool BfTypeInstance::HasOverrideMethods()
- {
- if (mTypeDef->mHasOverrideMethods)
- return true;
- if (mBaseType != NULL)
- return mBaseType->HasOverrideMethods();
- return false;
- }
- bool BfTypeInstance::GetResultInfo(BfType*& valueType, int& okTagId)
- {
- BF_ASSERT(!IsDataIncomplete());
- if (mFieldInstances.size() < 2)
- return false;
- for (auto& fieldInstance : mFieldInstances)
- {
- if (!fieldInstance.mIsEnumPayloadCase)
- continue;
- if ((fieldInstance.mIsEnumPayloadCase) && (fieldInstance.GetFieldDef()->mName == "Ok") && (fieldInstance.mResolvedType->IsTuple()))
- {
- auto tupleType = (BfTupleType*)fieldInstance.mResolvedType;
- if (tupleType->mFieldInstances.size() == 1)
- {
- valueType = tupleType->mFieldInstances[0].mResolvedType;
- okTagId = -fieldInstance.mDataIdx - 1;
- return true;
- }
- }
- break;
- }
- return false;
- }
- void BfTypeInstance::ReportMemory(MemReporter* memReporter)
- {
- memReporter->Add(sizeof(BfTypeInstance));
- int depSize = 0;
- depSize += sizeof((int)mDependencyMap.mTypeSet.mAllocSize * sizeof(BfDependencyMap::TypeMap::EntryPair));
- memReporter->Add("DepMap", depSize);
- memReporter->AddVec(mInterfaces, false);
- memReporter->AddVec(mInterfaceMethodTable, false);
- if (mCustomAttributes != NULL)
- mCustomAttributes->ReportMemory(memReporter);
-
- int methodCount = 0;
- memReporter->BeginSection("MethodData");
- for (auto& methodInstGroup : mMethodInstanceGroups)
- {
- memReporter->Add(sizeof(BfMethodInstanceGroup));
- if (methodInstGroup.mDefault != NULL)
- {
- methodInstGroup.mDefault->ReportMemory(memReporter);
- methodCount++;
- }
- if (methodInstGroup.mMethodSpecializationMap != NULL)
- {
- memReporter->Add((int)methodInstGroup.mMethodSpecializationMap->mAllocSize * sizeof(Dictionary<BfTypeVector, BfMethodInstance*>::EntryPair));
- for (auto kv : *methodInstGroup.mMethodSpecializationMap)
- {
- methodCount++;
- kv.mValue->ReportMemory(memReporter);
- }
- }
- }
- memReporter->EndSection();
- memReporter->AddVec("VirtualMethodTable", mVirtualMethodTable, false);
- memReporter->AddVec(mFieldInstances, false);
- memReporter->AddVec(mInternalMethods, false);
- memReporter->AddMap("SpecializedMethodReferences", mSpecializedMethodReferences, false);
- memReporter->AddMap("LookupResults", mLookupResults, false);
- if (mConstHolder != NULL)
- memReporter->Add("ConstHolder", mConstHolder->mTempAlloc.GetTotalAllocSize());
- if (mHotTypeData != NULL)
- {
- AutoMemReporter autoMemReporter(memReporter, "HotTypeData");
- memReporter->Add(sizeof(BfHotTypeData));
- memReporter->AddVec(mHotTypeData->mTypeVersions, false);
- for (auto typeVersion : mHotTypeData->mTypeVersions)
- {
- memReporter->AddVec(typeVersion->mMembers, false);
- memReporter->AddVec(typeVersion->mInterfaceMapping, false);
- }
- memReporter->AddVec(mHotTypeData->mVTableEntries, false);
- for (auto& entry : mHotTypeData->mVTableEntries)
- memReporter->AddStr(entry.mFuncName, false);
- }
- BfLog("%s\t%d\t%d\n", mContext->mScratchModule->TypeToString(this, BfTypeNameFlags_None).c_str(), IsGenericTypeInstance(), methodCount);
- }
- bool BfTypeInstance::IsTypeMemberAccessible(BfTypeDef* declaringTypeDef, BfTypeDef* activeTypeDef)
- {
- if (activeTypeDef == NULL)
- return false;
- if (declaringTypeDef == activeTypeDef)
- return true;
- return activeTypeDef->mProject->ContainsReference(declaringTypeDef->mProject);
- }
- bool BfTypeInstance::IsTypeMemberAccessible(BfTypeDef* declaringTypeDef, BfProject* curProject)
- {
- if (declaringTypeDef->mProject == curProject)
- return true;
- return curProject->ContainsReference(declaringTypeDef->mProject);
- }
- bool BfTypeInstance::WantsGCMarking()
- {
- if (IsObjectOrInterface())
- return true;
- if ((IsEnum()) && (!IsPayloadEnum()))
- return false;
- BF_ASSERT(mDefineState >= BfTypeDefineState_Defined);
- return mWantsGCMarking;
- }
- ///
- BfGenericExtensionEntry::~BfGenericExtensionEntry()
- {
- for (auto genericParamInstance : mGenericParams)
- genericParamInstance->Release();
- }
- ///
- BfGenericTypeInstance::~BfGenericTypeInstance()
- {
- for (auto genericParamInstance : mGenericParams)
- genericParamInstance->Release();
- delete mGenericExtensionInfo;
- }
- BfGenericTypeInstance::GenericParamsVector* BfGenericTypeInstance::GetGenericParamsVector(BfTypeDef* declaringTypeDef)
- {
- if ((declaringTypeDef == mTypeDef) ||
- (declaringTypeDef->mTypeDeclaration == mTypeDef->mTypeDeclaration))
- return &mGenericParams;
- if (mGenericExtensionInfo == NULL)
- return NULL;
- BfGenericExtensionEntry* genericExEntry = NULL;
- if (mGenericExtensionInfo->mExtensionMap.TryGetValue(declaringTypeDef, &genericExEntry))
- return &genericExEntry->mGenericParams;
-
- return &mGenericParams;
- }
- void BfGenericTypeInstance::GenerateProjectsReferenced()
- {
- BF_ASSERT(mProjectsReferenced.empty());
- mProjectsReferenced.push_back(mTypeDef->mProject);
- for (auto genericArgType : mTypeGenericArguments)
- BfTypeUtils::GetProjectList(genericArgType, &mProjectsReferenced, 0);
- }
- bool BfGenericTypeInstance::IsSpecializedByAutoCompleteMethod()
- {
- for (auto methodArg : mTypeGenericArguments)
- {
- // If we are specialized by an autocompleted method reference
- if (methodArg->IsMethodRef())
- {
- auto methodRefType = (BfMethodRefType*)methodArg;
- if (methodRefType->mIsAutoCompleteMethod)
- return true;
- }
- }
- return false;
- }
- bool BfGenericTypeInstance::IsNullable()
- {
- return (mTypeDef == mContext->mCompiler->mNullableTypeDef);
- }
- bool BfGenericTypeInstance::HasVarConstraints()
- {
- for (auto genericParam : mGenericParams)
- {
- if (genericParam->mGenericParamFlags & BfGenericParamFlag_Var)
- return true;
- }
- return false;
- }
- bool BfGenericTypeInstance::IsTypeMemberIncluded(BfTypeDef* typeDef, BfTypeDef* activeTypeDef, BfModule* module)
- {
- if (mGenericExtensionInfo == NULL)
- return true;
- if ((typeDef == NULL) || (typeDef == activeTypeDef))
- return true;
- if (typeDef->mTypeDeclaration == mTypeDef->mTypeDeclaration)
- return true;
-
- // The combined type declaration is the root type declaration, it's implicitly included
- if (typeDef->mTypeDeclaration == mTypeDef->mTypeDeclaration)
- return true;
-
- BfGenericExtensionEntry* genericExEntry = NULL;
- if (!mGenericExtensionInfo->mExtensionMap.TryGetValue(typeDef, &genericExEntry))
- return true;
- if (mIsUnspecialized)
- {
- if (module == NULL)
- return true; // During population
- auto declConstraints = &genericExEntry->mGenericParams;
- for (int genericIdx = 0; genericIdx < (int)declConstraints->size(); genericIdx++)
- {
- auto genericType = mTypeGenericArguments[genericIdx];
- auto declGenericParam = (*declConstraints)[genericIdx];
- if (!module->CheckGenericConstraints(BfGenericParamSource(), genericType, NULL, declGenericParam))
- return false;
- //if (!mModule->AreConstraintsSubset((*declConstraints)[genericIdx], (*activeConstraints)[genericIdx]))
- //isSubset = false;
- }
- return true;
- }
- /*else if ((mIsUnspecialized) && (activeTypeDef != NULL))
- {
- auto subsetItr = genericExEntry->mConstraintSubsetMap.find(activeTypeDef);
- if (subsetItr != genericExEntry->mConstraintSubsetMap.end())
- {
- return subsetItr->second;
- }
- auto declConstraints = &genericExEntry->mGenericParams;
- auto activeConstraints = GetGenericParamsVector(activeTypeDef);
- bool isSubset = true;
- for (int genericIdx = 0; genericIdx < (int)declConstraints->size(); genericIdx++)
- {
- if (!mModule->AreConstraintsSubset((*declConstraints)[genericIdx], (*activeConstraints)[genericIdx]))
- isSubset = false;
- }
- // We can't cache this because the meaning of the params may change, IE: TypeName<@M0> needs to consider the
- // constraints of @M0 for each method it is checked against
- if (!IsUnspecializedTypeVariation())
- genericExEntry->mConstraintSubsetMap[activeTypeDef] = isSubset;
- return isSubset;
- }*/
- return genericExEntry->mConstraintsPassed;
- }
- void BfGenericTypeInstance::ReportMemory(MemReporter* memReporter)
- {
- BfTypeInstance::ReportMemory(memReporter);
- memReporter->Add(sizeof(BfGenericTypeInstance) - sizeof(BfTypeInstance));
- memReporter->AddVec(mTypeGenericArgumentRefs, false);
- memReporter->AddVec(mTypeGenericArguments, false);
- memReporter->AddVec(mGenericParams, false);
- memReporter->AddVec(mProjectsReferenced, false);
- }
- BfType* BfTypeInstance::GetUnderlyingType()
- {
- if (!mIsTypedPrimitive)
- return NULL;
- auto checkTypeInst = this;
- while (checkTypeInst != NULL)
- {
- if (!checkTypeInst->mFieldInstances.empty())
- return checkTypeInst->mFieldInstances.back().mResolvedType;
- checkTypeInst = checkTypeInst->mBaseType;
- if (checkTypeInst->IsIncomplete())
- mModule->PopulateType(checkTypeInst, BfPopulateType_Data);
- }
- BF_FATAL("Failed");
- return NULL;
- }
- bool BfTypeInstance::IsValuelessType()
- {
- if ((mTypeDef->mTypeCode == BfTypeCode_Object) || (mTypeDef->mTypeCode == BfTypeCode_Interface))
- {
- return false;
- }
- if (mTypeDef->mIsOpaque)
- return false;
- BF_ASSERT(mInstSize >= 0);
- if (mInstSize == 0)
- {
- return true;
- }
- return false;
- }
- bool BfTypeInstance::IsIRFuncUsed(BfIRFunction func)
- {
- for (auto& group : mMethodInstanceGroups)
- {
- if (group.mDefault != NULL)
- if (group.mDefault->mIRFunction == func)
- return true;
- if (group.mMethodSpecializationMap != NULL)
- {
- for (auto& methodInstPair : *group.mMethodSpecializationMap)
- {
- auto methodInstance = methodInstPair.mValue;
- if (methodInstance->mIRFunction == func)
- return true;
- }
- }
- }
- return false;
- }
- void BfTypeInstance::CalcHotVirtualData(Array<int>* ifaceMapping)
- {
- if (IsIncomplete())
- {
- BF_ASSERT(mHotTypeData != NULL);
- return;
- }
- if (ifaceMapping != NULL)
- {
- for (auto iface : mInterfaces)
- {
- int slotNum = iface.mInterfaceType->mSlotNum;
- if (slotNum >= 0)
- {
- if (slotNum >= (int)ifaceMapping->size())
- ifaceMapping->Resize(slotNum + 1);
- (*ifaceMapping)[slotNum] = iface.mInterfaceType->mTypeId;
- }
- }
- if (mBaseType != NULL)
- mBaseType->CalcHotVirtualData(ifaceMapping);
- }
- }
- //////////////////////////////////////////////////////////////////////////
- BfClosureType::BfClosureType(BfTypeInstance* srcDelegate, Val128 closureHash) :
- mSource(srcDelegate->mTypeDef->mSystem)
- {
- mSrcDelegate = srcDelegate;
- mTypeDef = mSrcDelegate->mTypeDef;
- mCreatedTypeDef = false;
- mClosureHash = closureHash;
- // Hash in 72 bits of closureHash (12 characters) - low does 60 bits, high does 12 bits
- mNameAdd = "_" + BfTypeUtils::HashEncode64(mClosureHash.mLow) + BfTypeUtils::HashEncode64(mClosureHash.mHigh >> 52);
- mIsUnique = false;
- }
- BfClosureType::~BfClosureType()
- {
- if (mCreatedTypeDef)
- delete mTypeDef;
- for (auto directAllocNode : mDirectAllocNodes)
- delete directAllocNode;
- }
- void BfClosureType::Init(BfProject* bfProject)
- {
- auto srcTypeDef = mSrcDelegate->mTypeDef;
- auto system = mSrcDelegate->mModule->mSystem;
- mTypeDef = new BfTypeDef();
- mTypeDef->mSystem = system;
- mTypeDef->mSource = &mSource;
- mTypeDef->mSource->mRefCount++;
- mTypeDef->mProject = bfProject;
- mTypeDef->mTypeCode = srcTypeDef->mTypeCode;
- mTypeDef->mName = system->GetAtom(srcTypeDef->mName->mString + mNameAdd);
- mTypeDef->mOuterType = srcTypeDef->mOuterType;
- mTypeDef->mNamespace = srcTypeDef->mNamespace;
- system->AddNamespaceUsage(mTypeDef->mNamespace, mTypeDef->mProject);
- mTypeDef->mHash = srcTypeDef->mHash;
- mTypeDef->mSignatureHash = srcTypeDef->mSignatureHash;
- // mTypeDef->mFullName = srcTypeDef->mFullName;
- // if (!mTypeDef->mFullName.mParts.IsEmpty())
- // mTypeDef->mFullName.mParts.pop_back();
- // mTypeDef->mFullName.mParts.push_back(mTypeDef->mName);
- if (srcTypeDef->mFullName.mSize > 0)
- mTypeDef->mFullName.Set(srcTypeDef->mFullName.mParts, srcTypeDef->mFullName.mSize - 1, &mTypeDef->mName, 1);
- else
- mTypeDef->mFullName.Set(&mTypeDef->mName, 1, NULL, 0);
- system->TrackName(mTypeDef);
- mTypeDef->mTypeCode = BfTypeCode_Object;
- mTypeDef->mIsDelegate = true;
- mTypeDef->mIsClosure = true;
- mTypeDef->mDefState = BfTypeDef::DefState_Defined;
- auto baseDirectTypeRef = BfAstNode::ZeroedAlloc<BfDirectTypeReference>();
- baseDirectTypeRef->Init(mSrcDelegate);
- mDirectAllocNodes.push_back(baseDirectTypeRef);
- mTypeDef->mBaseTypes.push_back(baseDirectTypeRef);
- //mTypeDef->mBaseTypes.push_back(BfDefBuilder::AllocTypeReference(&mSource, mSrcDelegate));
- mCreatedTypeDef = true;
- //mTypeDef->mBaseTypes.push_back(srcTypeDef);
- }
- BfFieldDef* BfClosureType::AddField(BfType* type, const StringImpl& name)
- {
- auto directTypeRef = BfAstNode::ZeroedAlloc<BfDirectTypeReference>();
- directTypeRef->Init(type);
- mDirectAllocNodes.push_back(directTypeRef);
- return BfDefBuilder::AddField(mTypeDef, directTypeRef, name);
- }
- BfMethodDef* BfClosureType::AddDtor()
- {
- return BfDefBuilder::AddDtor(mTypeDef);
- }
- void BfClosureType::Finish()
- {
- HASH128_MIXIN(mTypeDef->mSignatureHash, mClosureHash);
- auto bfSource = mTypeDef->mSource;
- auto bfSystem = bfSource->mSystem;
- BfDefBuilder bfDefBuilder(bfSystem);
- bfDefBuilder.mCurTypeDef = mTypeDef;
- bfDefBuilder.FinishTypeDef(false);
- }
- //////////////////////////////////////////////////////////////////////////
- BfDelegateType::~BfDelegateType()
- {
- delete mTypeDef;
- for (auto directAllocNode : mDirectAllocNodes)
- delete directAllocNode;
- }
- //////////////////////////////////////////////////////////////////////////
- BfTupleType::BfTupleType()
- {
- mCreatedTypeDef = false;
- mSource = NULL;
- mTypeDef = NULL;
- mHasUnspecializedMembers = false;
- }
- BfTupleType::~BfTupleType()
- {
- if (mCreatedTypeDef)
- delete mTypeDef;
- delete mSource;
- }
- void BfTupleType::Init(BfProject* bfProject, BfTypeInstance* valueTypeInstance)
- {
- auto srcTypeDef = valueTypeInstance->mTypeDef;
- auto system = valueTypeInstance->mModule->mSystem;
- if (mTypeDef == NULL)
- mTypeDef = new BfTypeDef();
- for (auto field : mTypeDef->mFields)
- delete field;
- mTypeDef->mFields.Clear();
- mTypeDef->mSystem = system;
- mTypeDef->mProject = bfProject;
- mTypeDef->mTypeCode = srcTypeDef->mTypeCode;
- mTypeDef->mName = system->mEmptyAtom;
- mTypeDef->mSystem = system;
-
- mTypeDef->mHash = srcTypeDef->mHash;
- mTypeDef->mSignatureHash = srcTypeDef->mSignatureHash;
- mTypeDef->mTypeCode = BfTypeCode_Struct;
-
- mCreatedTypeDef = true;
- }
- BfFieldDef* BfTupleType::AddField(const StringImpl& name)
- {
- return BfDefBuilder::AddField(mTypeDef, NULL, name);
- }
- void BfTupleType::Finish()
- {
- auto bfSystem = mTypeDef->mSystem;
- mSource = new BfSource(bfSystem);
- mTypeDef->mSource = mSource;
- mTypeDef->mSource->mRefCount++;
- BfDefBuilder bfDefBuilder(bfSystem);
- bfDefBuilder.mCurTypeDef = mTypeDef;
- bfDefBuilder.FinishTypeDef(true);
- mHasUnspecializedMembers = false;
- }
- //////////////////////////////////////////////////////////////////////////
- int BfArrayType::GetLengthBitCount()
- {
- if (mBaseType == NULL)
- mModule->PopulateType(mBaseType, BfPopulateType_BaseType);
- mModule->PopulateType(mBaseType);
- if ((mBaseType->mFieldInstances.size() == 0) || (mBaseType->mFieldInstances[0].GetFieldDef()->mName != "mLength"))
- {
- return 0;
- }
- return mBaseType->mFieldInstances[0].mResolvedType->mSize * 8;
- }
- //////////////////////////////////////////////////////////////////////////
- int BfMethodRefType::GetCaptureDataCount()
- {
- return (int)mDataToParamIdx.size();
- }
- BfType* BfMethodRefType::GetCaptureType(int captureDataIdx)
- {
- return mMethodRef->GetParamType(mDataToParamIdx[captureDataIdx]);
- }
- int BfMethodRefType::GetDataIdxFromParamIdx(int paramIdx)
- {
- if (paramIdx == -1)
- {
- if (mMethodRef->HasThis())
- return 0;
- return -1;
- }
- return mParamToDataIdx[paramIdx];
- }
- int BfMethodRefType::GetParamIdxFromDataIdx(int dataIdx)
- {
- return mDataToParamIdx[dataIdx];
- }
- bool BfMethodRefType::WantsDataPassedAsSplat(int dataIdx)
- {
- if (dataIdx != -1)
- return false;
- return mMethodRef->GetParamIsSplat(mDataToParamIdx[dataIdx]);
- }
- //////////////////////////////////////////////////////////////////////////
- size_t BfTypeVectorHash::operator()(const BfTypeVector& typeVec) const
- {
- size_t hash = typeVec.size();
- BfResolvedTypeSet::LookupContext ctx;
- for (auto type : typeVec)
- hash = ((hash ^ BfResolvedTypeSet::Hash(type, &ctx)) << 5) - hash;
- return hash;
- }
- bool BfTypeVectorEquals::operator()(const BfTypeVector& lhs, const BfTypeVector& rhs) const
- {
- if (lhs.size() != rhs.size())
- return false;
- for (int i = 0; i < (int)lhs.size(); i++)
- if (lhs[i] != rhs[i])
- return false;
- return true;
- }
- //////////////////////////////////////////////////////////////////////////
- bool BfCustomAttributes::Contains(BfTypeDef* typeDef)
- {
- for (auto& customAttr : mAttributes)
- if (customAttr.mType->mTypeDef == typeDef)
- return true;
- return false;
- }
- BfCustomAttribute* BfCustomAttributes::Get(BfTypeDef * typeDef)
- {
- for (auto& customAttr : mAttributes)
- if (customAttr.mType->mTypeDef == typeDef)
- return &customAttr;
- return NULL;
- }
- //////////////////////////////////////////////////////////////////////////
- BfResolvedTypeSet::~BfResolvedTypeSet()
- {
- }
- #define HASH_VAL_PTR 1
- #define HASH_VAL_BOXED 2
- #define HASH_VAL_REF 3
- #define HASH_VAL_OUT 4
- #define HASH_VAL_MUT 5
- #define HASH_RETTYPE 6
- #define HASH_CONCRETE_INTERFACE 7
- #define HASH_SIZED_ARRAY 8
- #define HASH_CONSTTYPE 9
- #define HASH_VAL_TUPLE 10
- #define HASH_DELEGATE 11
- #define HASH_CONSTEXPR 12
- #define HASH_GLOBAL 13
- BfVariant BfResolvedTypeSet::EvaluateToVariant(LookupContext* ctx, BfExpression* expr, BfType*& constGenericParam)
- {
- BfConstResolver constResolver(ctx->mModule);
- BfVariant variant = { BfTypeCode_None };
- constResolver.Evaluate(expr);
- if (constResolver.mResult)
- {
- auto result = constResolver.mResult;
- if (result.mKind == BfTypedValueKind_GenericConstValue)
- {
- constGenericParam = result.mType;
- return variant;
- }
- else
- {
- variant = ctx->mModule->TypedValueToVariant(expr, result, true);
- // Limit the types of constants to prevent duplicate values with different types - we don't want to hash a typeref with an int32
- // when the constraint requirement is int64 (but we don't know that at hash time)
- if (BfIRConstHolder::IsInt(variant.mTypeCode))
- variant.mTypeCode = BfTypeCode_Int64;
- else if (variant.mTypeCode == BfTypeCode_Single)
- {
- variant.mTypeCode = BfTypeCode_Double;
- variant.mDouble = variant.mSingle;
- }
- }
- }
- return variant;
- }
- int BfResolvedTypeSet::Hash(BfType* type, LookupContext* ctx, bool allowRef)
- {
- //BP_ZONE("BfResolvedTypeSet::Hash");
- if (type->IsBoxed())
- {
- BfBoxedType* boxedType = (BfBoxedType*)type;
- int elemHash = Hash(boxedType->mElementType, ctx) ^ HASH_VAL_BOXED;
- return (elemHash << 5) - elemHash;
- }
- else if (type->IsArray())
- {
- BfArrayType* arrayType = (BfArrayType*)type;
- int elemHash = Hash(arrayType->mTypeGenericArguments[0], ctx) ^ (arrayType->mDimensions << 8);
- return (elemHash << 5) - elemHash;
- }
- else if (type->IsDelegateFromTypeRef() || type->IsFunctionFromTypeRef())
- {
- int hashVal = HASH_DELEGATE;
- BfMethodInstance* invokeMethodInstance = ctx->mModule->GetRawMethodInstanceAtIdx(type->ToTypeInstance(), 0, "Invoke");
- hashVal = ((hashVal ^ (Hash(invokeMethodInstance->mReturnType, ctx))) << 5) - hashVal;
- for (int paramIdx = 0; paramIdx < invokeMethodInstance->mParams.size(); paramIdx++)
- {
- // Parse attributes?
- hashVal = ((hashVal ^ (Hash(invokeMethodInstance->GetParamType(paramIdx), ctx))) << 5) - hashVal;
- String paramName = invokeMethodInstance->GetParamName(paramIdx);
- int nameHash = (int)Hash64(paramName.c_str(), (int)paramName.length());
- hashVal = ((hashVal ^ (nameHash)) << 5) - hashVal;
- }
- return hashVal;
- }
- else if (type->IsTypeInstance())
- {
- BfTypeInstance* typeInst = (BfTypeInstance*)type;
- int hashVal;
- if (typeInst->mTypeDef != NULL)
- hashVal = typeInst->mTypeDef->mHash;
- if (type->IsClosure())
- {
- auto closureType = (BfClosureType*)type;
- if (closureType->mIsUnique)
- return false;
- hashVal = ((hashVal ^ (int)closureType->mClosureHash.mLow) << 5) - hashVal;
- }
- else if (type->IsGenericTypeInstance())
- {
- BfGenericTypeInstance* genericType = (BfGenericTypeInstance*)type;
- for (auto genericArg : genericType->mTypeGenericArguments)
- hashVal = ((hashVal ^ (Hash(genericArg, ctx))) << 5) - hashVal;
- }
- else if (type->IsTuple())
- {
- hashVal = HASH_VAL_TUPLE;
- BfTupleType* tupleType = (BfTupleType*)type;
- for (int fieldIdx = 0; fieldIdx < (int)tupleType->mFieldInstances.size(); fieldIdx++)
- {
- BfFieldInstance* fieldInstance = &tupleType->mFieldInstances[fieldIdx];
-
- auto fieldType = fieldInstance->mResolvedType;
- hashVal = ((hashVal ^ (Hash(fieldType, ctx))) << 5) - hashVal;
- BfFieldDef* fieldDef = NULL;
- if (tupleType->mTypeDef != NULL)
- fieldDef = fieldInstance->GetFieldDef();
- int nameHash = 0;
- if (fieldDef == NULL)
- {
- char nameStr[64];
- sprintf(nameStr, "%d", fieldIdx);
- nameHash = (int)Hash64(nameStr, strlen(nameStr));
- }
- else
- {
- nameHash = (int)Hash64(fieldDef->mName.c_str(), (int)fieldDef->mName.length());
- }
- hashVal = ((hashVal ^ (nameHash)) << 5) - hashVal;
- }
- }
- return hashVal;
- }
- else if (type->IsPrimitiveType())
- {
- BfPrimitiveType* primType = (BfPrimitiveType*)type;
- return primType->mTypeDef->mHash;
- }
- else if (type->IsPointer())
- {
- BfPointerType* pointerType = (BfPointerType*) type;
- int elemHash = Hash(pointerType->mElementType, ctx) ^ HASH_VAL_PTR;
- return (elemHash << 5) - elemHash;
- }
- else if (type->IsGenericParam())
- {
- auto genericParam = (BfGenericParamType*)type;
- return (((int)genericParam->mGenericParamKind + 0xB00) << 8) ^ (genericParam->mGenericParamIdx + 1);
- }
- else if (type->IsRef())
- {
- auto refType = (BfRefType*)type;
- int elemHash = Hash(refType->mElementType, ctx) ^ (HASH_VAL_REF + (int)refType->mRefKind);
- return (elemHash << 5) - elemHash;
- }
- else if (type->IsRetTypeType())
- {
- auto retTypeType = (BfRetTypeType*)type;
- int elemHash = Hash(retTypeType->mElementType, ctx) ^ HASH_RETTYPE;
- return (elemHash << 5) - elemHash;
- }
- else if (type->IsConcreteInterfaceType())
- {
- auto concreteInterfaceType = (BfConcreteInterfaceType*)type;
- int elemHash = Hash(concreteInterfaceType->mInterface, ctx) ^ HASH_CONCRETE_INTERFACE;
- return (elemHash << 5) - elemHash;
- }
- else if (type->IsSizedArray())
- {
- auto sizedArray = (BfSizedArrayType*)type;
- int elemHash = Hash(sizedArray->mElementType, ctx) ^ HASH_SIZED_ARRAY;
- int hashVal = (elemHash << 5) - elemHash;
- if (type->IsUnknownSizedArray())
- {
- auto unknownSizedArray = (BfUnknownSizedArrayType*)type;
- int elemHash = Hash(unknownSizedArray->mElementCountSource, ctx);
- hashVal = ((hashVal ^ elemHash) << 5) - hashVal;
- }
- else
- hashVal = ((hashVal ^ (int)sizedArray->mElementCount) << 5) - hashVal;
- return hashVal;
- }
- else if (type->IsMethodRef())
- {
- auto methodRefType = (BfMethodRefType*)type;
- if (methodRefType->IsNull())
- return 0;
- return (int)((int)(intptr)(methodRefType->mMethodRef) << 5) ^ (int)(intptr)(methodRefType->mOwner) ^ methodRefType->mOwnerRevision;
- }
- else if (type->IsConstExprValue())
- {
- BfConstExprValueType* constExprValueType = (BfConstExprValueType*)type;
- int hashVal = ((int)constExprValueType->mValue.mTypeCode << 17) ^ (constExprValueType->mValue.mInt32 << 3) ^ HASH_CONSTTYPE;
- int elemHash = Hash(constExprValueType->mType, ctx);
- hashVal = ((hashVal ^ elemHash) << 5) - hashVal;
- return hashVal;
- }
- else
- {
- BF_FATAL("Not handled");
- }
- return 0;
- }
- void BfResolvedTypeSet::HashGenericArguments(BfTypeReference* typeRef, LookupContext* ctx, int& hashVal)
- {
- if (auto elementedTypeRef = BfNodeDynCast<BfElementedTypeRef>(typeRef))
- {
- HashGenericArguments(elementedTypeRef->mElementType, ctx, hashVal);
- }
- else if (auto qualifiedTypeRef = BfNodeDynCast<BfQualifiedTypeReference>(typeRef))
- {
- HashGenericArguments(qualifiedTypeRef->mLeft, ctx, hashVal);
- }
- if (auto genericTypeRef = BfNodeDynCast<BfGenericInstanceTypeRef>(typeRef))
- {
- for (auto genericArg : genericTypeRef->mGenericArguments)
- hashVal = ((hashVal ^ (Hash(genericArg, ctx, BfHashFlag_AllowGenericParamConstValue))) << 5) - hashVal;
- }
- }
- static int HashNode(BfAstNode* node)
- {
- if (node == NULL)
- return (int)Hash64(NULL, 0);
- const char* nameStr = node->GetSourceData()->mSrc + node->GetSrcStart();
- return (int)Hash64(nameStr, node->GetSrcLength());
- }
- int BfResolvedTypeSet::Hash(BfTypeReference* typeRef, LookupContext* ctx, BfHashFlags flags)
- {
- // if (auto typeDefTypeRef = BfNodeDynCast<BfTypeDefTypeReference>(typeRef))
- // {
- // if (typeDefTypeRef->mTypeDef != NULL)
- // {
- // int hashVal = typeDefTypeRef->mTypeDef->mHash;
- //
- // if (typeDefTypeRef->mTypeDef->mGenericParamDefs.size() != 0)
- // {
- // auto checkTypeInstance = ctx->mModule->mCurTypeInstance;
- // if (checkTypeInstance->IsBoxed())
- // checkTypeInstance = checkTypeInstance->GetUnderlyingType()->ToTypeInstance();
- //
- // //if (!module->TypeHasParent(module->mCurTypeInstance->mTypeDef, typeDefTypeRef->mTypeDef->mParentType))
- // auto outerType = ctx->mModule->mSystem->GetOuterTypeNonPartial(typeDefTypeRef->mTypeDef);
- // BfTypeDef* commonOuterType = ctx->mModule->FindCommonOuterType(ctx->mModule->mCurTypeInstance->mTypeDef, outerType);
- // //BfTypeDef* commonOuterType = ctx->mModule->FindCommonOuterType(ctx->mModule->GetActiveTypeDef(), typeDefTypeRef->mTypeDef->mOuterType);
- // if ((commonOuterType == NULL) || (commonOuterType->mGenericParamDefs.size() == 0))
- // {
- // ctx->mModule->Fail("Generic arguments expected", typeDefTypeRef);
- // ctx->mFailed = true;
- // return 0;
- // }
- //
- // BF_ASSERT(checkTypeInstance->IsGenericTypeInstance());
- // auto curGenericTypeInst = (BfGenericTypeInstance*)checkTypeInstance;
- // //int numParentGenericParams = (int)typeDefTypeRef->mTypeDef->mGenericParams.size();
- // int numParentGenericParams = (int)commonOuterType->mGenericParamDefs.size();
- // for (int i = 0; i < numParentGenericParams; i++)
- // {
- // hashVal = ((hashVal ^ (Hash(curGenericTypeInst->mTypeGenericArguments[i], ctx))) << 5) - hashVal;
- // }
- // }
- //
- // return hashVal;
- // }
- //
- // bool isHeadType = typeRef == ctx->mRootTypeRef;
- //
- // BfResolveTypeRefFlags resolveFlags = BfResolveTypeRefFlag_None;
- // if ((flags & BfHashFlag_AllowGenericParamConstValue) != 0)
- // resolveFlags = (BfResolveTypeRefFlags)(resolveFlags | BfResolveTypeRefFlag_AllowGenericParamConstValue);
- //
- // auto resolvedType = ctx->mModule->ResolveTypeRef(typeRef, BfPopulateType_Identity, resolveFlags);
- // if (resolvedType == NULL)
- // {
- // ctx->mFailed = true;
- // return 0;
- // }
- // return Hash(resolvedType, ctx);
- // }
- if ((typeRef == ctx->mRootTypeRef) && (ctx->mRootTypeDef != NULL))
- {
- BfTypeDef* typeDef = ctx->mRootTypeDef;
-
- int hashVal = typeDef->mHash;
- if (typeDef->mGenericParamDefs.size() != 0)
- {
- auto checkTypeInstance = ctx->mModule->mCurTypeInstance;
- if (checkTypeInstance->IsBoxed())
- checkTypeInstance = checkTypeInstance->GetUnderlyingType()->ToTypeInstance();
- auto outerType = ctx->mModule->mSystem->GetOuterTypeNonPartial(typeDef);
- BfTypeDef* commonOuterType = ctx->mModule->FindCommonOuterType(ctx->mModule->mCurTypeInstance->mTypeDef, outerType);
- if ((commonOuterType == NULL) || (commonOuterType->mGenericParamDefs.size() == 0))
- {
- ctx->mModule->Fail("Generic arguments expected", typeRef);
- ctx->mFailed = true;
- return 0;
- }
- BF_ASSERT(checkTypeInstance->IsGenericTypeInstance());
- auto curGenericTypeInst = (BfGenericTypeInstance*)checkTypeInstance;
- int numParentGenericParams = (int)commonOuterType->mGenericParamDefs.size();
- for (int i = 0; i < numParentGenericParams; i++)
- {
- hashVal = ((hashVal ^ (Hash(curGenericTypeInst->mTypeGenericArguments[i], ctx))) << 5) - hashVal;
- }
- }
- return hashVal;
- }
- if (typeRef->IsNamedTypeReference())
- {
- bool isHeadType = typeRef == ctx->mRootTypeRef;
-
- BfResolveTypeRefFlags resolveFlags = BfResolveTypeRefFlag_None;
- if ((flags & BfHashFlag_AllowGenericParamConstValue) != 0)
- resolveFlags = (BfResolveTypeRefFlags)(resolveFlags | BfResolveTypeRefFlag_AllowGenericParamConstValue);
-
- auto resolvedType = ctx->mModule->ResolveTypeRef(typeRef, BfPopulateType_Identity, resolveFlags);
- if (resolvedType == NULL)
- {
- ctx->mFailed = true;
- return 0;
- }
- return Hash(resolvedType, ctx);
- }
- else if (auto genericInstTypeRef = BfNodeDynCastExact<BfGenericInstanceTypeRef>(typeRef))
- {
- //BfType* type = NULL;
- BfTypeDef* elementTypeDef = ctx->mModule->ResolveGenericInstanceDef(genericInstTypeRef);
- int hashVal;
- /*if (type != NULL)
- {
- hashVal = Hash(type, ctx);
- }
- else */
- {
- if (elementTypeDef == NULL)
- {
- ctx->mFailed = true;
- return 0;
- }
- if (ctx->mRootTypeRef == typeRef)
- {
- BF_ASSERT((ctx->mRootTypeDef == NULL) || (ctx->mRootTypeDef == elementTypeDef));
- ctx->mRootTypeDef = elementTypeDef;
- }
- hashVal = elementTypeDef->mHash;
- }
-
- // Do we need to add generic arguments from an in-context outer class?
- if ((elementTypeDef->mOuterType != NULL) && (ctx->mModule->mCurTypeInstance != NULL) && (ctx->mModule->mCurTypeInstance->IsGenericTypeInstance()))
- {
- BfTypeDef* commonOuterType = ctx->mModule->FindCommonOuterType(ctx->mModule->mCurTypeInstance->mTypeDef, elementTypeDef->mOuterType);
- if (commonOuterType != NULL)
- {
- auto parentTypeInstance = (BfGenericTypeInstance*)ctx->mModule->mCurTypeInstance;
- int numParentGenericParams = (int)commonOuterType->mGenericParamDefs.size();
- for (int i = 0; i < numParentGenericParams; i++)
- hashVal = ((hashVal ^ (Hash(parentTypeInstance->mTypeGenericArguments[i], ctx))) << 5) - hashVal;
- }
- }
- HashGenericArguments(genericInstTypeRef, ctx, hashVal);
- /*for (auto genericArg : genericInstTypeRef->mGenericArguments)
- hashVal = ((hashVal ^ (Hash(genericArg, ctx))) << 5) - hashVal;*/
-
- return hashVal;
- }
- else if (auto tupleTypeRef = BfNodeDynCastExact<BfTupleTypeRef>(typeRef))
- {
- int hashVal = HASH_VAL_TUPLE;
- for (int fieldIdx = 0; fieldIdx < (int)tupleTypeRef->mFieldTypes.size(); fieldIdx++)
- {
- BfTypeReference* fieldType = tupleTypeRef->mFieldTypes[fieldIdx];
- hashVal = ((hashVal ^ (Hash(fieldType, ctx))) << 5) - hashVal;
- int nameHash = 0;
- BfIdentifierNode* fieldName = NULL;
- if (fieldIdx < (int)tupleTypeRef->mFieldNames.size())
- fieldName = tupleTypeRef->mFieldNames[fieldIdx];
- if (fieldName != NULL)
- {
- const char* nameStr = fieldName->GetSourceData()->mSrc + fieldName->GetSrcStart();
- nameHash = (int)Hash64(nameStr, fieldName->GetSrcLength());
- }
- else
- {
- char nameStr[64];
- sprintf(nameStr, "%d", fieldIdx);
- nameHash = (int)Hash64(nameStr, strlen(nameStr));
- }
- hashVal = ((hashVal ^ (nameHash)) << 5) - hashVal;
- }
- return hashVal;
- }
- else if (auto arrayType = BfNodeDynCastExact<BfArrayTypeRef>(typeRef))
- {
- if ((arrayType->mDimensions == 1) && (arrayType->mParams.size() != 0))
- {
- int elemHash = Hash(arrayType->mElementType, ctx) ^ HASH_SIZED_ARRAY;
- int hashVal = (elemHash << 5) - elemHash;
- // Sized array
- if (arrayType->mParams.size() != 1)
- {
- ctx->mFailed = true;
- ctx->mModule->Fail("Only one size parameter expected", arrayType->mParams[1]);
- return 0;
- }
- intptr elementCount = -1;
- BfExpression* sizeExpr = BfNodeDynCast<BfExpression>(arrayType->mParams[0]);
- BF_ASSERT(sizeExpr != NULL);
- if (sizeExpr != NULL)
- {
- BfConstResolver constResolver(ctx->mModule);
- BfType* intType = ctx->mModule->GetPrimitiveType(BfTypeCode_IntPtr);
- constResolver.mAllowGenericConstValue = true;
- constResolver.mExpectingType = intType;
- BfTypedValue typedVal = constResolver.Resolve(sizeExpr);
- if (typedVal.mKind == BfTypedValueKind_GenericConstValue)
- {
- int elemHash = Hash(typedVal.mType, ctx);
- /*BF_ASSERT(typedVal.mType->IsGenericParam());
- auto genericParamInstance = ctx->mModule->GetGenericParamInstance((BfGenericParamType*)typedVal.mType);
- if ((genericParamInstance->mTypeConstraint == NULL) ||
- (!ctx->mModule->CanImplicitlyCast(BfTypedValue(ctx->mModule->mBfIRBuilder->GetFakeVal(), genericParamInstance->mTypeConstraint),
- ctx->mModule->GetPrimitiveType(BfTypeCode_IntPtr))))
- {
- ctx->mModule->Fail(StrFormat("Generic constraint '%s' is not convertible to 'int'", ctx->mModule->TypeToString(typedVal.mType).c_str()), sizeExpr);
- }*/
- hashVal = ((hashVal ^ elemHash) << 5) - hashVal;
- return hashVal;
- }
- if (!typedVal)
- ctx->mFailed = true;
- if (typedVal)
- typedVal = ctx->mModule->Cast(sizeExpr, typedVal, intType);
- if (typedVal)
- {
- auto constant = ctx->mModule->mBfIRBuilder->GetConstant(typedVal.mValue);
- if (constant->mConstType == BfConstType_Undef)
- {
- elementCount = -1; // Marker for undef
- }
- else
- {
- BF_ASSERT(BfIRBuilder::IsInt(constant->mTypeCode));
- elementCount = (intptr)constant->mInt64;
- if (elementCount < 0)
- {
- ctx->mFailed = true;
- ctx->mModule->Fail("Arrays cannot have negative sizes", arrayType->mParams[0]);
- return 0;
- }
- }
- }
- }
-
- hashVal = ((hashVal ^ (int)elementCount) << 5) - hashVal;
- return hashVal;
- }
- else
- {
- if (arrayType->mDimensions != (int)arrayType->mParams.size() + 1)
- {
- for (auto arg : arrayType->mParams)
- {
- if (auto tokenNode = BfNodeDynCastExact<BfTokenNode>(arg))
- {
- if (tokenNode->GetToken() == BfToken_Comma)
- continue;
- }
- ctx->mFailed = true;
- ctx->mModule->Fail("Multidimensional arrays cannot have explicit sizes. Consider using a strided array (ie: int[2][2]) instead.", arg);
- return 0;
- }
- }
- int elemHash = Hash(arrayType->mElementType, ctx) ^ (arrayType->mDimensions << 8);
- return (elemHash << 5) - elemHash;
- }
- }
- else if (auto pointerType = BfNodeDynCastExact<BfPointerTypeRef>(typeRef))
- {
- int elemHash = Hash(pointerType->mElementType, ctx) ^ HASH_VAL_PTR;
- return (elemHash << 5) - elemHash;
- }
- else if (auto nullableType = BfNodeDynCastExact<BfNullableTypeRef>(typeRef))
- {
- if (ctx->mRootTypeRef == typeRef)
- ctx->mRootTypeDef = ctx->mModule->mCompiler->mNullableTypeDef;
- int hashVal = ctx->mModule->mCompiler->mNullableTypeDef->mHash;
- hashVal = ((hashVal ^ (Hash(nullableType->mElementType, ctx))) << 5) - hashVal;
- return hashVal;
- }
- else if (auto boxedType = BfNodeDynCastExact<BfBoxedTypeRef>(typeRef))
- {
- int elemHash = Hash(boxedType->mElementType, ctx) ^ HASH_VAL_BOXED;
- return (elemHash << 5) - elemHash;
- }
- else if (auto refType = BfNodeDynCastExact<BfRefTypeRef>(typeRef))
- {
- if ((flags & BfHashFlag_AllowRef) != 0)
- {
- auto refKind = BfRefType::RefKind_Ref;
- if (refType->mRefToken == NULL)
- refKind = BfRefType::RefKind_Ref;
- else if (refType->mRefToken->GetToken() == BfToken_Out)
- refKind = BfRefType::RefKind_Out;
- else if (refType->mRefToken->GetToken() == BfToken_Mut)
- refKind = BfRefType::RefKind_Mut;
- int elemHash = Hash(refType->mElementType, ctx) ^ (HASH_VAL_REF + (int)refKind);
- return (elemHash << 5) - elemHash;
- }
- else
- {
- ctx->mModule->ResolveTypeRef(typeRef); // To throw an error...
- ctx->mFailed = true;
- return 0;
- //return Hash(refType->mElementType, ctx);
- }
- }
- else if (auto genericParamTypeRef = BfNodeDynCastExact<BfGenericParamTypeRef>(typeRef))
- {
- return (((int)genericParamTypeRef->mGenericParamKind) << 8) ^ (genericParamTypeRef->mGenericParamIdx + 1);
- }
- else if (auto qualifiedTypeRef = BfNodeDynCastExact<BfQualifiedTypeReference>(typeRef))
- {
- /*auto leftType = ctx->mModule->ResolveTypeRef(qualifiedTypeRef->mLeft, BfPopulateType_Identity);
- if (leftType == NULL)
- {
- ctx->mFailed = true;
- return 0;
- }
- if (qualifiedTypeRef->mRight == NULL)
- {
- ctx->mFailed = true;
- return 0;
- }
- auto rightType = ctx->mModule->ResolveInnerType(leftType, qualifiedTypeRef->mRight);
- if (rightType == NULL)
- {
- ctx->mFailed = true;
- return 0;
- }
- return Hash(rightType, ctx);*/
- auto resolvedType = ctx->mModule->ResolveTypeRef(typeRef, BfPopulateType_Identity);
- if (resolvedType == NULL)
- {
- ctx->mFailed = true;
- return 0;
- }
- return Hash(resolvedType, ctx);
- }
- else if (auto varType = BfNodeDynCastExact<BfVarTypeReference>(typeRef))
- {
- // Don't allow 'var'
- //*failed = true;
- auto primType = ctx->mModule->GetPrimitiveType(BfTypeCode_Var);
- return Hash(primType, ctx);
- }
- else if (auto letType = BfNodeDynCastExact<BfLetTypeReference>(typeRef))
- {
- // Don't allow 'let'
- ctx->mFailed = true;
- auto primType = ctx->mModule->GetPrimitiveType(BfTypeCode_Let);
- return Hash(primType, ctx);
- }
- else if (auto retTypeTypeRef = BfNodeDynCastExact<BfRetTypeTypeRef>(typeRef))
- {
- // Don't cause infinite loop, but if we have an inner 'rettype' then try to directly resolve that --
- // Only use the HAS_RETTYPE for root-level rettype insertions
- if (ctx->mRootTypeRef != retTypeTypeRef)
- {
- auto type = ctx->mModule->ResolveTypeRef(retTypeTypeRef);
- return Hash(type, ctx, flags);
- }
- int elemHash = Hash(retTypeTypeRef->mElementType, ctx) ^ HASH_RETTYPE;
- return (elemHash << 5) - elemHash;
- }
- else if (auto resolvedTypeRef = BfNodeDynCastExact<BfResolvedTypeReference>(typeRef))
- {
- return Hash(resolvedTypeRef->mType, ctx);
- }
- else if (auto constTypeRef = BfNodeDynCastExact<BfConstTypeRef>(typeRef))
- {
- // We purposely don't mix in a HASH_CONSTTYPE because there's no such thing as a const type in Beef, so we just strip it
- return Hash(constTypeRef->mElementType, ctx, flags);
- }
- else if (auto delegateTypeRef = BfNodeDynCastExact<BfDelegateTypeRef>(typeRef))
- {
- int hashVal = HASH_DELEGATE;
- if (delegateTypeRef->mReturnType != NULL)
- hashVal = ((hashVal ^ (Hash(delegateTypeRef->mReturnType, ctx))) << 5) - hashVal;
- else
- ctx->mFailed = true;
-
- for (auto param : delegateTypeRef->mParams)
- {
- // Parse attributes?
- BfTypeReference* fieldType = param->mTypeRef;
- hashVal = ((hashVal ^ (Hash(fieldType, ctx, BfHashFlag_AllowRef))) << 5) - hashVal;
- hashVal = ((hashVal ^ (HashNode(param->mNameNode))) << 5) - hashVal;
- if (param->mNameNode == NULL)
- {
- ctx->mFailed = true;
- }
- }
- return hashVal;
- }
- else if (auto declTypeRef = BfNodeDynCastExact<BfDeclTypeRef>(typeRef))
- {
- if (ctx->mResolvedType == NULL)
- {
- if (declTypeRef->mTarget != NULL)
- {
- BfTypedValue result;
- //
- {
- BfMethodState methodState;
- SetAndRestoreValue<BfMethodState*> prevMethodState(ctx->mModule->mCurMethodState, &methodState, false);
- if (ctx->mModule->mCurMethodState == NULL)
- prevMethodState.Set();
- methodState.mTempKind = BfMethodState::TempKind_NonStatic;
- SetAndRestoreValue<bool> ignoreWrites(ctx->mModule->mBfIRBuilder->mIgnoreWrites, true);
- SetAndRestoreValue<bool> allowUninitReads(ctx->mModule->mCurMethodState->mAllowUinitReads, true);
- result = ctx->mModule->CreateValueFromExpression(declTypeRef->mTarget);
- }
- ctx->mResolvedType = result.mType;
- }
- }
- if (ctx->mResolvedType == NULL)
- {
- ctx->mFailed = true;
- return 0;
- }
- return Hash(ctx->mResolvedType, ctx, flags);
- }
- else if (auto constExprTypeRef = BfNodeDynCastExact<BfConstExprTypeRef>(typeRef))
- {
- BfVariant result;
- if (constExprTypeRef->mConstExpr != NULL)
- {
- BfType* constGenericParam = NULL;
- result = EvaluateToVariant(ctx, constExprTypeRef->mConstExpr, constGenericParam);
- if (constGenericParam != NULL)
- return Hash(constGenericParam, ctx);
- }
- if (result.mTypeCode == BfTypeCode_None)
- {
- ctx->mFailed = true;
- return 0;
- }
- return ((int)result.mTypeCode << 17) ^ (result.mInt32 << 3) ^ HASH_CONSTTYPE;
- }
- else if (auto dotTypeRef = BfNodeDynCastExact<BfDotTypeReference>(typeRef))
- {
- ctx->mModule->ResolveTypeRef(dotTypeRef);
- ctx->mFailed = true;
- return 0;
- }
- else
- {
- BF_FATAL("Not handled");
- }
- return 0;
- }
- // These types can be from different contexts ("foreign" types) so we can't just compare ptrs
- bool BfResolvedTypeSet::Equals(BfType* lhs, BfType* rhs, LookupContext* ctx)
- {
- if (lhs->IsBoxed())
- {
- if (!rhs->IsBoxed())
- return false;
- BfBoxedType* lhsBoxedType = (BfBoxedType*) lhs;
- BfBoxedType* rhsBoxedType = (BfBoxedType*) rhs;
- return Equals(lhsBoxedType->mElementType, rhsBoxedType->mElementType, ctx);
- }
- else if (lhs->IsArray())
- {
- if (!rhs->IsArray())
- return false;
- BfArrayType* lhsArrayType = (BfArrayType*) lhs;
- BfArrayType* rhsArrayType = (BfArrayType*) rhs;
- if (lhsArrayType->mDimensions != rhsArrayType->mDimensions)
- return false;
- return Equals(lhsArrayType->mTypeGenericArguments[0], rhsArrayType->mTypeGenericArguments[0], ctx);
- }
- else if (lhs->IsTypeInstance())
- {
- if ((!rhs->IsTypeInstance()) || (rhs->IsBoxed()))
- return false;
- BfTypeInstance* lhsInst = (BfTypeInstance*)lhs;
- BfTypeInstance* rhsInst = (BfTypeInstance*)rhs;
- if (lhs->IsClosure())
- {
- if (!rhs->IsClosure())
- return false;
- auto lhsClosure = (BfClosureType*)lhs;
- auto rhsClosure = (BfClosureType*)rhs;
- if ((lhsClosure->mIsUnique) || (rhsClosure->mIsUnique))
- return false;
- if (lhsClosure->mBaseType != rhsClosure->mBaseType)
- return false;
- return lhsClosure->mClosureHash == rhsClosure->mClosureHash;
- }
-
- if (lhs->IsGenericTypeInstance())
- {
- if (!rhs->IsGenericTypeInstance())
- return false;
- BfGenericTypeInstance* lhsGenericType = (BfGenericTypeInstance*)lhs;
- BfGenericTypeInstance* rhsGenericType = (BfGenericTypeInstance*)rhs;
- if (lhsGenericType->mTypeGenericArguments.size() != rhsGenericType->mTypeGenericArguments.size())
- return false;
- if (lhsGenericType->mTypeDef != rhsGenericType->mTypeDef)
- return false;
- for (int i = 0; i < (int)lhsGenericType->mTypeGenericArguments.size(); i++)
- {
- if (!Equals(lhsGenericType->mTypeGenericArguments[i], rhsGenericType->mTypeGenericArguments[i], ctx))
- return false;
- }
- }
- if (lhs->IsTuple())
- {
- if (!rhs->IsTuple())
- return false;
- BfTupleType* lhsTupleType = (BfTupleType*)lhs;
- BfTupleType* rhsTupleType = (BfTupleType*)rhs;
- if (lhsTupleType->mFieldInstances.size() != rhsTupleType->mFieldInstances.size())
- return false;
- for (int fieldIdx = 0; fieldIdx < (int)lhsTupleType->mFieldInstances.size(); fieldIdx++)
- {
- auto lhsFieldInstance = &lhsTupleType->mFieldInstances[fieldIdx];
- auto rhsFieldInstance = &rhsTupleType->mFieldInstances[fieldIdx];
- if (lhsFieldInstance->mResolvedType != rhsFieldInstance->mResolvedType)
- return false;
- auto lhsFieldDef = lhsFieldInstance->GetFieldDef();
- if (rhsTupleType->mTypeDef == NULL)
- {
- char c = lhsFieldDef->mName[0];
- if ((c < '0') || (c > '9'))
- return false;
- }
- else
- {
- auto rhsFieldDef = rhsFieldInstance->GetFieldDef();
- if (lhsFieldDef->mName != rhsFieldDef->mName)
- return false;
- }
- }
- return true;
- }
- return lhsInst->mTypeDef == rhsInst->mTypeDef;
- }
- else if (lhs->IsPrimitiveType())
- {
- if (!rhs->IsPrimitiveType())
- return false;
- BfPrimitiveType* lhsPrimType = (BfPrimitiveType*)lhs;
- BfPrimitiveType* rhsPrimType = (BfPrimitiveType*)rhs;
- return lhsPrimType->mTypeDef == rhsPrimType->mTypeDef;
- }
- else if (lhs->IsPointer())
- {
- if (!rhs->IsPointer())
- return false;
- BfPointerType* lhsPtrType = (BfPointerType*)lhs;
- BfPointerType* rhsPtrType = (BfPointerType*)rhs;
- return Equals(lhsPtrType->mElementType, rhsPtrType->mElementType, ctx);
- }
- else if (lhs->IsGenericParam())
- {
- if (!rhs->IsGenericParam())
- return false;
- BfGenericParamType* lhsGenericParamType = (BfGenericParamType*)lhs;
- BfGenericParamType* rhsGenericParamType = (BfGenericParamType*)rhs;
- return (lhsGenericParamType->mGenericParamKind == rhsGenericParamType->mGenericParamKind) &&
- (lhsGenericParamType->mGenericParamIdx == rhsGenericParamType->mGenericParamIdx);
- }
- else if (lhs->IsRef())
- {
- if (!rhs->IsRef())
- return false;
- BfRefType* lhsRefType = (BfRefType*)lhs;
- BfRefType* rhsRefType = (BfRefType*)rhs;
- return (lhsRefType->mElementType == rhsRefType->mElementType) && (lhsRefType->mRefKind == rhsRefType->mRefKind);
- }
- else if (lhs->IsRetTypeType())
- {
- if (!rhs->IsRetTypeType())
- return false;
- BfRetTypeType* lhsRetTypeType = (BfRetTypeType*)lhs;
- BfRetTypeType* rhsRetTypeType = (BfRetTypeType*)rhs;
- return (lhsRetTypeType->mElementType == rhsRetTypeType->mElementType);
- }
- else if (lhs->IsConcreteInterfaceType())
- {
- if (!rhs->IsConcreteInterfaceType())
- return false;
- BfConcreteInterfaceType* lhsConcreteInterfaceType = (BfConcreteInterfaceType*)lhs;
- BfConcreteInterfaceType* rhsConcreteInterfaceType = (BfConcreteInterfaceType*)rhs;
- return (lhsConcreteInterfaceType->mInterface == rhsConcreteInterfaceType->mInterface);
- }
- else if (lhs->IsSizedArray())
- {
- if (!rhs->IsSizedArray())
- return false;
- BfSizedArrayType* lhsSizedArrayType = (BfSizedArrayType*)lhs;
- BfSizedArrayType* rhsSizedArrayType = (BfSizedArrayType*)rhs;
- return (lhsSizedArrayType->mElementType == rhsSizedArrayType->mElementType) &&
- (lhsSizedArrayType->mElementCount == rhsSizedArrayType->mElementCount);
- }
- else if (lhs->IsMethodRef())
- {
- if (!rhs->IsMethodRef())
- return false;
- BfMethodRefType* lhsMethodRefType = (BfMethodRefType*)lhs;
- BfMethodRefType* rhsMethodRefType = (BfMethodRefType*)rhs;
- return (lhsMethodRefType->mMethodRef == rhsMethodRefType->mMethodRef) &&
- (lhsMethodRefType->mOwner == rhsMethodRefType->mOwner) &&
- (lhsMethodRefType->mOwnerRevision == rhsMethodRefType->mOwnerRevision);
- }
- else if (lhs->IsDelegateFromTypeRef() || lhs->IsFunctionFromTypeRef())
- {
- if (!rhs->IsDelegateFromTypeRef() && !rhs->IsFunctionFromTypeRef())
- return false;
- if (lhs->IsDelegate() != rhs->IsDelegate())
- return false;
- BfDelegateType* lhsDelegateType = (BfDelegateType*)lhs;
- BfDelegateType* rhsDelegateType = (BfDelegateType*)rhs;
- if (lhsDelegateType->mTypeDef->mIsDelegate != rhsDelegateType->mTypeDef->mIsDelegate)
- return false;
- BfMethodInstance* lhsInvokeMethodInstance = ctx->mModule->GetRawMethodInstanceAtIdx(lhsDelegateType->ToTypeInstance(), 0, "Invoke");
- BfMethodInstance* rhsInvokeMethodInstance = ctx->mModule->GetRawMethodInstanceAtIdx(rhsDelegateType->ToTypeInstance(), 0, "Invoke");
- if (lhsInvokeMethodInstance->mReturnType != rhsInvokeMethodInstance->mReturnType)
- return false;
- if (lhsInvokeMethodInstance->GetParamCount() != rhsInvokeMethodInstance->GetParamCount())
- return false;
- for (int paramIdx = 0; paramIdx < lhsInvokeMethodInstance->GetParamCount(); paramIdx++)
- {
- if (lhsInvokeMethodInstance->GetParamType(paramIdx) != rhsInvokeMethodInstance->GetParamType(paramIdx))
- return false;
- if (lhsInvokeMethodInstance->GetParamName(paramIdx) != rhsInvokeMethodInstance->GetParamName(paramIdx))
- return false;
- }
- return true;
- }
- else if ((lhs->IsConstExprValue()) || (rhs->IsConstExprValue()))
- {
- if (!lhs->IsConstExprValue() || !rhs->IsConstExprValue())
- return false;
- BfConstExprValueType* lhsConstExprValueType = (BfConstExprValueType*)lhs;
- BfConstExprValueType* rhsConstExprValueType = (BfConstExprValueType*)rhs;
- return (lhsConstExprValueType->mType == rhsConstExprValueType->mType) &&
- (lhsConstExprValueType->mValue.mTypeCode == rhsConstExprValueType->mValue.mTypeCode) &&
- (lhsConstExprValueType->mValue.mInt64 == rhsConstExprValueType->mValue.mInt64);
- }
- else
- {
- BF_FATAL("Not handled");
- }
- return 0;
- }
- bool BfResolvedTypeSet::GenericTypeEquals(BfGenericTypeInstance* lhsGenericType, BfTypeVector* lhsTypeGenericArguments, BfTypeReference* rhs, LookupContext* ctx, int& genericParamOffset)
- {
- //BP_ZONE("BfResolvedTypeSet::GenericTypeEquals");
- if (auto elementedTypeRef = BfNodeDynCast<BfElementedTypeRef>(rhs))
- {
- if (!GenericTypeEquals(lhsGenericType, lhsTypeGenericArguments, elementedTypeRef->mElementType, ctx, genericParamOffset))
- return false;
- //_GetTypeRefs(elementedTypeRef->mElementType);
- }
- else if (auto qualifiedTypeRef = BfNodeDynCastExact<BfQualifiedTypeReference>(rhs))
- {
- //_GetTypeRefs(qualifiedTypeRef->mLeft);
- if (!GenericTypeEquals(lhsGenericType, lhsTypeGenericArguments, qualifiedTypeRef->mLeft, ctx, genericParamOffset))
- return false;
- }
- if (auto genericTypeRef = BfNodeDynCastExact<BfGenericInstanceTypeRef>(rhs))
- {
- if (genericTypeRef->mGenericArguments.size() > lhsTypeGenericArguments->size() + genericParamOffset)
- return false;
- for (auto genericArg : genericTypeRef->mGenericArguments)
- {
- if (!Equals((*lhsTypeGenericArguments)[genericParamOffset++], genericArg, ctx))
- return false;
- }
- }
- return true;
- }
- bool BfResolvedTypeSet::GenericTypeEquals(BfGenericTypeInstance* lhsGenericType, BfTypeVector* lhsTypeGenericArguments, BfTypeReference* rhs, BfTypeDef* rhsTypeDef, LookupContext* ctx)
- {
- auto rhsGenericTypeInstRef = BfNodeDynCastExact<BfGenericInstanceTypeRef>(rhs);
- if (rhsGenericTypeInstRef == NULL)
- {
- if (auto rhsNullableTypeRef = BfNodeDynCastExact<BfNullableTypeRef>(rhs))
- {
- if (rhsNullableTypeRef != NULL)
- {
- if (lhsGenericType->mTypeDef != ctx->mModule->mContext->mCompiler->mNullableTypeDef)
- return false;
- return Equals(lhsGenericType->mTypeGenericArguments[0], rhsNullableTypeRef->mElementType, ctx);
- }
- }
- if ((rhsTypeDef != NULL) && (ctx->mModule->mCurTypeInstance != NULL))
- {
- // See if we're referring to an non-generic inner type where the outer type is generic
- if (lhsGenericType->mTypeDef != rhsTypeDef)
- return false;
- BfTypeDef* commonOuterType = ctx->mModule->FindCommonOuterType(ctx->mModule->mCurTypeInstance->mTypeDef, rhsTypeDef->mOuterType);
- if (commonOuterType != NULL)
- {
- BfTypeInstance* checkTypeInstance = ctx->mModule->mCurTypeInstance;
- if (checkTypeInstance->IsBoxed())
- checkTypeInstance = checkTypeInstance->GetUnderlyingType()->ToTypeInstance();
- BF_ASSERT(checkTypeInstance->IsGenericTypeInstance());
- int numParentGenericParams = (int) commonOuterType->mGenericParamDefs.size();
- auto curTypeInstance = (BfGenericTypeInstance*)checkTypeInstance;
- if (lhsGenericType->mTypeGenericArguments.size() != numParentGenericParams)
- return false;
- for (int i = 0; i < (int) numParentGenericParams; i++)
- if ((*lhsTypeGenericArguments)[i] != curTypeInstance->mTypeGenericArguments[i])
- return false;
- return true;
- }
- }
- if (auto rhsQualifiedTypeRef = BfNodeDynCastExact<BfQualifiedTypeReference>(rhs))
- {
- /*auto rhsLeftType = ctx->mModule->ResolveTypeRef(rhsQualifiedTypeRef->mLeft, BfPopulateType_Identity);
- if (rhsLeftType == NULL)
- return false;
- auto rhsRightType = ctx->mModule->ResolveInnerType(rhsLeftType, rhsQualifiedTypeRef->mRight);
- if (rhsRightType == NULL)
- return false;*/
- auto rhsRightType = ctx->mModule->ResolveTypeRef(rhs, BfPopulateType_Identity);
- return rhsRightType == lhsGenericType;
- }
-
- return false;
- }
- BfTypeDef* elementTypeDef = ctx->mModule->ResolveGenericInstanceDef(rhsGenericTypeInstRef);
- if (elementTypeDef != lhsGenericType->mTypeDef)
- return false;
- int genericParamOffset = 0;
- // Do we need to add generic arguments from an in-context outer class?
- if ((elementTypeDef->mOuterType != NULL) && (ctx->mModule->mCurTypeInstance != NULL) && (ctx->mModule->mCurTypeInstance->IsGenericTypeInstance()))
- {
- BfTypeDef* commonOuterType = ctx->mModule->FindCommonOuterType(ctx->mModule->mCurTypeInstance->mTypeDef, elementTypeDef->mOuterType);
- if (commonOuterType != NULL)
- {
- auto parentTypeInstance = (BfGenericTypeInstance*)ctx->mModule->mCurTypeInstance;
- genericParamOffset = (int) commonOuterType->mGenericParamDefs.size();
- for (int i = 0; i < genericParamOffset; i++)
- for (auto genericArg : parentTypeInstance->mTypeGenericArguments)
- {
- if (parentTypeInstance->mTypeGenericArguments[i] != (*lhsTypeGenericArguments)[i])
- return false;
- }
- }
- }
- /*if (lhsTypeGenericArguments->size() != rhsGenericTypeInstRef->mGenericArguments.size() + genericParamOffset)
- {
- return false;
- }
- for (int i = 0; i < (int) rhsGenericTypeInstRef->mGenericArguments.size(); i++)
- {
- if (!Equals(lhsGenericType->mTypeGenericArguments[i + genericParamOffset], rhsGenericTypeInstRef->mGenericArguments[i], module))
- return false;
- }*/
- if (!GenericTypeEquals(lhsGenericType, lhsTypeGenericArguments, rhs, ctx, genericParamOffset))
- return false;
- return genericParamOffset == (int)lhsTypeGenericArguments->size();
- }
- BfType* BfResolvedTypeSet::LookupContext::ResolveTypeRef(BfTypeReference* typeReference)
- {
- return mModule->ResolveTypeRef(typeReference, BfPopulateType_Identity, BfResolveTypeRefFlag_AllowGenericParamConstValue);
- }
- BfTypeDef* BfResolvedTypeSet::LookupContext::ResolveToTypeDef(BfTypeReference* typeReference)
- {
- if (typeReference == mRootTypeRef)
- return mRootTypeDef;
- if (auto typeDefTypeRef = BfNodeDynCast<BfDirectTypeDefReference>(typeReference))
- {
- return typeDefTypeRef->mTypeDef;
- }
- auto type = mModule->ResolveTypeRef(typeReference, BfPopulateType_Identity, BfResolveTypeRefFlag_AllowGenericParamConstValue);
- if (type == NULL)
- return NULL;
- auto typeInst = type->ToTypeInstance();
- if (typeInst == NULL)
- return NULL;
- return typeInst->mTypeDef;
- }
- bool BfResolvedTypeSet::Equals(BfType* lhs, BfTypeReference* rhs, LookupContext* ctx)
- {
- //BP_ZONE("BfResolvedTypeSet::Equals");
- if (ctx->mRootTypeRef != rhs)
- {
- if (auto retTypeRef = BfNodeDynCastExact<BfRetTypeTypeRef>(rhs))
- {
- auto resolvedType = ctx->mModule->ResolveTypeRef(rhs);
- return lhs == resolvedType;
- }
- }
- if (rhs->IsNamedTypeReference())
- {
- if ((ctx->mRootTypeRef != rhs) || (ctx->mRootTypeDef == NULL))
- {
- auto rhsResolvedType = ctx->ResolveTypeRef(rhs);
- return Equals(lhs, rhsResolvedType, ctx);
- }
- }
-
- // auto rhsTypeDefTypeRef = BfNodeDynCast<BfTypeDefTypeReference>(rhs);
- // if (rhsTypeDefTypeRef != NULL)
- // {
- // // mTypeDef not set, need to resolve in module
- // if (rhsTypeDefTypeRef->mTypeDef == NULL)
- // {
- // auto rhsResolvedType = ctx->mModule->ResolveTypeRef(rhsTypeDefTypeRef, BfPopulateType_Identity, BfResolveTypeRefFlag_AllowGenericParamConstValue);
- // return Equals(lhs, rhsResolvedType, ctx);
- // }
- // }
- if (auto declTypeRef = BfNodeDynCastExact<BfDeclTypeRef>(rhs))
- {
- BF_ASSERT(ctx->mResolvedType != NULL);
- return lhs == ctx->mResolvedType;
- }
-
- // Strip off 'const' - it's just an error when applied to a typeRef in Beef
- auto constTypeRef = BfNodeDynCastExact<BfConstTypeRef>(rhs);
- if (constTypeRef != NULL)
- return Equals(lhs, constTypeRef->mElementType, ctx);
- if (lhs->IsBoxed())
- {
- auto rhsBoxedTypeRef = BfNodeDynCastExact<BfBoxedTypeRef>(rhs);
- if (rhsBoxedTypeRef == NULL)
- return false;
- BfBoxedType* lhsBoxedType = (BfBoxedType*) lhs;
- return Equals(lhsBoxedType->mElementType, rhsBoxedTypeRef->mElementType, ctx);
- }
- else if (lhs->IsArray())
- {
- auto rhsArrayTypeRef = BfNodeDynCastExact<BfArrayTypeRef>(rhs);
- if (rhsArrayTypeRef == NULL)
- return false;
- BfArrayType* lhsArrayType = (BfArrayType*) lhs;
- if (lhsArrayType->mDimensions != rhsArrayTypeRef->mDimensions)
- return false;
- return Equals(lhsArrayType->mTypeGenericArguments[0], rhsArrayTypeRef->mElementType, ctx);
- }
- else if (lhs->IsDelegateFromTypeRef() || lhs->IsFunctionFromTypeRef())
- {
- auto rhsDelegateType = BfNodeDynCastExact<BfDelegateTypeRef>(rhs);
- if (rhsDelegateType == NULL)
- return false;
- BfDelegateType* lhsDelegateType = (BfDelegateType*)lhs;
- BfMethodInstance* lhsInvokeMethodInstance = ctx->mModule->GetRawMethodInstanceAtIdx(lhsDelegateType->ToTypeInstance(), 0, "Invoke");
-
- if ((lhs->IsDelegate()) != (rhsDelegateType->mTypeToken->GetToken() == BfToken_Delegate))
- return false;
- if (!Equals(lhsInvokeMethodInstance->mReturnType, rhsDelegateType->mReturnType, ctx))
- return false;
- if (lhsInvokeMethodInstance->GetParamCount() != (int)rhsDelegateType->mParams.size())
- return false;
- for (int paramIdx = 0; paramIdx < lhsInvokeMethodInstance->GetParamCount(); paramIdx++)
- {
- if (!Equals(lhsInvokeMethodInstance->GetParamType(paramIdx), rhsDelegateType->mParams[paramIdx]->mTypeRef, ctx))
- return false;
- if (lhsInvokeMethodInstance->GetParamName(paramIdx) != rhsDelegateType->mParams[paramIdx]->mNameNode->ToString())
- return false;
- }
- return true;
- }
- else if (lhs->IsTypeInstance())
- {
- BfTypeInstance* lhsInst = (BfTypeInstance*) lhs;
-
- if (lhs->IsGenericTypeInstance())
- {
- auto rhsTypeDef = ctx->ResolveToTypeDef(rhs);
- if (rhsTypeDef == NULL)
- return false;
- BfGenericTypeInstance* lhsGenericType = (BfGenericTypeInstance*) lhs;
- return GenericTypeEquals(lhsGenericType, &lhsGenericType->mTypeGenericArguments, rhs, rhsTypeDef, ctx);
- }
- if (lhs->IsTuple())
- {
- if (!rhs->IsA<BfTupleTypeRef>())
- return false;
- BfTupleTypeRef* rhsTupleTypeRef = (BfTupleTypeRef*)rhs;
- BfTupleType* lhsTupleType = (BfTupleType*)lhs;
-
- if (lhsTupleType->mFieldInstances.size() != rhsTupleTypeRef->mFieldTypes.size())
- return false;
- for (int fieldIdx = 0; fieldIdx < (int)lhsTupleType->mFieldInstances.size(); fieldIdx++)
- {
- BfFieldInstance* fieldInstance = &lhsTupleType->mFieldInstances[fieldIdx];
- auto rhsResolvedType = ctx->mModule->ResolveTypeRef(rhsTupleTypeRef->mFieldTypes[fieldIdx], BfPopulateType_Identity);
- if (rhsResolvedType != fieldInstance->mResolvedType)
- return false;
- BfFieldDef* fieldTypeDef = fieldInstance->GetFieldDef();
- BfIdentifierNode* fieldName = NULL;
- if (fieldIdx < (int)rhsTupleTypeRef->mFieldNames.size())
- fieldName = rhsTupleTypeRef->mFieldNames[fieldIdx];
- if (fieldName != NULL)
- {
- if (fieldName->ToString() != fieldTypeDef->mName)
- return false;
- }
- else
- {
- char nameStr[64];
- sprintf(nameStr, "%d", fieldIdx);
- if (fieldTypeDef->mName != nameStr)
- return false;
- }
- }
- return true;
- }
- else
- {
- if (rhs->IsA<BfElementedTypeRef>())
- return false;
-
- if (!rhs->IsTypeDefTypeReference())
- {
- if (rhs->IsA<BfDelegateTypeRef>())
- return false; // Would have caught it before
- if (rhs->IsA<BfQualifiedTypeReference>())
- {
- //TODO: Under what circumstances was this supposed to be used? This caused an infinite loop comparing
- // 'var' against a delegate type instance
- auto resolvedType = ctx->mModule->ResolveTypeRef(rhs, BfPopulateType_Identity);
- if (resolvedType == lhsInst)
- {
- return true;
- }
- }
-
- return false;
- }
- auto rhsTypeDef = ctx->ResolveToTypeDef(rhs);
- if (rhsTypeDef == NULL)
- return false;
- return lhsInst->mTypeDef == rhsTypeDef;
- }
- }
- else if (lhs->IsPrimitiveType())
- {
- if (lhs->IsDot())
- {
- auto varTypeReference = BfNodeDynCastExact<BfDotTypeReference>(rhs);
- if (varTypeReference != NULL)
- return true;
- }
- if (lhs->IsVar())
- {
- auto varTypeReference = BfNodeDynCastExact<BfVarTypeReference>(rhs);
- if (varTypeReference != NULL)
- return true;
- }
- if (lhs->IsLet())
- {
- auto letTypeReference = BfNodeDynCastExact<BfLetTypeReference>(rhs);
- if (letTypeReference != NULL)
- return true;
- }
- if (!rhs->IsTypeDefTypeReference())
- return false;
-
- BfPrimitiveType* lhsPrimType = (BfPrimitiveType*)lhs;
- auto rhsTypeDef = ctx->ResolveToTypeDef(rhs);
- return lhsPrimType->mTypeDef == rhsTypeDef;
- // auto rhsTypeDefTypeRef = BfNodeDynCast<BfTypeDefTypeReference>(rhs);
- // if (rhsTypeDefTypeRef == NULL)
- // return false;
- // BfPrimitiveType* lhsPrimType = (BfPrimitiveType*)lhs;
- // return lhsPrimType->mTypeDef == rhsTypeDefTypeRef->mTypeDef;
- }
- else if (lhs->IsPointer())
- {
- auto rhsPointerTypeRef = BfNodeDynCastExact<BfPointerTypeRef>(rhs);
- if (rhsPointerTypeRef == NULL)
- return false;
- BfPointerType* lhsPtrType = (BfPointerType*)lhs;
- return Equals(lhsPtrType->mElementType, rhsPointerTypeRef->mElementType, ctx);
- }
- else if (lhs->IsGenericParam())
- {
- auto lhsGenericParamType = (BfGenericParamType*)lhs;
- auto rhsGenericParamTypeRef = BfNodeDynCastExact<BfGenericParamTypeRef>(rhs);
- if (rhsGenericParamTypeRef == NULL)
- {
- if (auto constExprTypeRef = BfNodeDynCastExact<BfConstExprTypeRef>(rhs))
- {
- BfVariant result;
- if (constExprTypeRef->mConstExpr == NULL)
- return false;
- BfType* constGenericParam = NULL;
- result = EvaluateToVariant(ctx, constExprTypeRef->mConstExpr, constGenericParam);
- return constGenericParam == lhs;
- }
- return false;
- }
- return (lhsGenericParamType->mGenericParamKind == rhsGenericParamTypeRef->mGenericParamKind) &&
- (lhsGenericParamType->mGenericParamIdx == rhsGenericParamTypeRef->mGenericParamIdx);
- }
- else if (lhs->IsRef())
- {
- auto lhsRefType = (BfRefType*)lhs;
- auto rhsRefTypeRef = BfNodeDynCastExact<BfRefTypeRef>(rhs);
- if (rhsRefTypeRef == NULL)
- return false;
- auto refKind = BfRefType::RefKind_Ref;
- if (rhsRefTypeRef->mRefToken == NULL)
- refKind = BfRefType::RefKind_Ref;
- else if (rhsRefTypeRef->mRefToken->GetToken() == BfToken_Out)
- refKind = BfRefType::RefKind_Out;
- else if (rhsRefTypeRef->mRefToken->GetToken() == BfToken_Mut)
- refKind = BfRefType::RefKind_Mut;
- return (lhsRefType->mRefKind == refKind) &&
- Equals(lhsRefType->mElementType, rhsRefTypeRef->mElementType, ctx);
- }
- else if (lhs->IsRetTypeType())
- {
- auto lhsRetTypeType = (BfRetTypeType*)lhs;
- auto rhsRetTypeTypeRef = BfNodeDynCastExact<BfRetTypeTypeRef>(rhs);
- if (rhsRetTypeTypeRef == NULL)
- return false;
- return Equals(lhsRetTypeType->mElementType, rhsRetTypeTypeRef->mElementType, ctx);
- }
- else if (lhs->IsConcreteInterfaceType())
- {
- // No way to create a reference to one of these
- return false;
- }
- else if (lhs->IsSizedArray())
- {
- auto rhsArrayTypeRef = BfNodeDynCastExact<BfArrayTypeRef>(rhs);
- if (rhsArrayTypeRef == NULL)
- return false;
- if ((rhsArrayTypeRef->mDimensions != 1) && (rhsArrayTypeRef->mParams.size() != 1))
- return false;
- BfSizedArrayType* lhsArrayType = (BfSizedArrayType*)lhs;
- if (!Equals(lhsArrayType->mElementType, rhsArrayTypeRef->mElementType, ctx))
- return false;
- intptr elementCount = -1;
- BfExpression* sizeExpr = BfNodeDynCast<BfExpression>(rhsArrayTypeRef->mParams[0]);
- BF_ASSERT(sizeExpr != NULL);
- if (sizeExpr != NULL)
- {
- SetAndRestoreValue<bool> prevIgnoreError(ctx->mModule->mIgnoreErrors, true);
- BfConstResolver constResolver(ctx->mModule);
- BfType* intType = ctx->mModule->GetPrimitiveType(BfTypeCode_IntPtr);
- constResolver.mAllowGenericConstValue = true;
- constResolver.mExpectingType = intType;
- BfTypedValue typedVal = constResolver.Resolve(sizeExpr);
- if (typedVal.mKind == BfTypedValueKind_GenericConstValue)
- {
- if (!lhs->IsUnknownSizedArray())
- return false;
- auto lhsUnknownSizedArray = (BfUnknownSizedArrayType*)lhs;
- return lhsUnknownSizedArray->mElementCountSource = typedVal.mType;
- }
- if (typedVal)
- typedVal = ctx->mModule->Cast(sizeExpr, typedVal, intType);
- if (typedVal)
- {
- if (lhs->IsUnknownSizedArray())
- return false;
-
- auto constant = ctx->mModule->mBfIRBuilder->GetConstant(typedVal.mValue);
- if (constant->mConstType == BfConstType_Undef)
- {
- elementCount = -1; // Marker for undef
- }
- else
- {
- BF_ASSERT(BfIRBuilder::IsInt(constant->mTypeCode));
- elementCount = (intptr)constant->mInt64;
- BF_ASSERT(elementCount >= 0); // Should have been caught in hash
- }
- }
- }
-
- return lhsArrayType->mElementCount == elementCount;
- }
- else if (lhs->IsMethodRef())
- {
- // Always make these unique. The MethodInstance value will change on rebuild anyway
- return false;
- }
- else if (lhs->IsConstExprValue())
- {
- auto constExprTypeRef = BfNodeDynCastExact<BfConstExprTypeRef>(rhs);
- if (constExprTypeRef == NULL)
- return false;
- if (!lhs->IsConstExprValue())
- return false;
- BfConstExprValueType* lhsConstExprType = (BfConstExprValueType*)lhs;
- BfVariant result;
- if (constExprTypeRef->mConstExpr != NULL)
- {
- BfType* constGenericParam = NULL;
- result = EvaluateToVariant(ctx, constExprTypeRef->mConstExpr, constGenericParam);
- if (constGenericParam != NULL)
- return false;
- }
- return (result.mTypeCode == lhsConstExprType->mValue.mTypeCode) &&
- (result.mInt64 == lhsConstExprType->mValue.mInt64);
- }
- else
- {
- BF_FATAL("Not handled");
- }
- return false;
- }
- void BfResolvedTypeSet::RemoveEntry(BfResolvedTypeSet::Entry* entry)
- {
- int hashIdx = (entry->mHash & 0x7FFFFFFF) % mHashSize;
- // if (entry->mPrev == NULL)
- // {
- // if (entry->mNext != NULL)
- // entry->mNext->mPrev = NULL;
- // BF_ASSERT(mHashHeads[bucket] == entry);
- // mHashHeads[bucket] = entry->mNext;
- // }
- // else
- // {
- // entry->mPrev->mNext = entry->mNext;
- // if (entry->mNext != NULL)
- // entry->mNext->mPrev = entry->mPrev;
- // }
- //
- // mSize--;
- bool found = false;
- Entry** srcCheckEntryPtr = &this->mHashHeads[hashIdx];
- Entry* checkEntry = *srcCheckEntryPtr;
- while (checkEntry != NULL)
- {
- if (checkEntry == entry)
- {
- this->mCount--;
- *srcCheckEntryPtr = checkEntry->mNext;
- found = true;
- }
- srcCheckEntryPtr = &checkEntry->mNext;
- checkEntry = checkEntry->mNext;
- }
-
- BF_ASSERT(found);
- BF_ASSERT(entry->mValue == NULL);
- Deallocate(entry);
- }
- // BfResolvedTypeSet::Iterator BfResolvedTypeSet::begin()
- // {
- // return ++Iterator(this);
- // }
- //
- // BfResolvedTypeSet::Iterator BfResolvedTypeSet::end()
- // {
- // Iterator itr(this);
- // itr.mCurBucket = HashSize;
- // return itr;
- // }
- //
- // BfResolvedTypeSet::Iterator BfResolvedTypeSet::erase(BfResolvedTypeSet::Iterator& itr)
- // {
- // auto next = itr;
- // ++next;
- //
- // auto cur = itr.mCurEntry;
- //
- // auto& hashHead = itr.mTypeSet->mHashHeads[itr.mCurBucket];
- //
- // if (hashHead == cur)
- // hashHead = cur->mNext;
- // if (cur->mPrev != NULL)
- // cur->mPrev->mNext = cur->mNext;
- // if (cur->mNext != NULL)
- // cur->mNext->mPrev = cur->mPrev;
- // delete cur;
- //
- // //BfLogSys("Deleting node %@ from bucket %d\n", cur, itr.mCurBucket);
- //
- // mSize--;
- // return next;
- // }
- //////////////////////////////////////////////////////////////////////////
- BfHotTypeVersion::~BfHotTypeVersion()
- {
- for (auto member : mMembers)
- member->Deref();
- }
- BfHotTypeData::~BfHotTypeData()
- {
- for (auto version : mTypeVersions)
- {
- version->Deref();
- }
- }
- BfHotTypeVersion* BfHotTypeData::GetTypeVersion(int hotCommitedIdx)
- {
- for (int checkIdx = (int)mTypeVersions.size() - 1; checkIdx >= 0; checkIdx--)
- {
- BfHotTypeVersion* hotTypeVersion = mTypeVersions[checkIdx];
- if (hotTypeVersion->mDeclHotCompileIdx <= hotCommitedIdx)
- return hotTypeVersion;
- }
- return NULL;
- }
- BfHotTypeVersion* BfHotTypeData::GetLatestVersion()
- {
- return mTypeVersions.back();
- }
- BfHotTypeVersion* BfHotTypeData::GetLatestVersionHead()
- {
- auto lastestVersion = mTypeVersions.back();
- for (int versionIdx = (int)mTypeVersions.size() - 1; versionIdx >= 0; versionIdx--)
- {
- auto checkVersion = mTypeVersions[versionIdx];
- if (checkVersion->mDataHash != lastestVersion->mDataHash)
- break;
- lastestVersion = checkVersion;
- }
- return lastestVersion;
- }
- void BfHotTypeData::ClearVersionsAfter(int hotIdx)
- {
- while (!mTypeVersions.IsEmpty())
- {
- auto hotTypeVersion = mTypeVersions.back();
- if (hotTypeVersion->mDeclHotCompileIdx > hotIdx)
- {
- hotTypeVersion->Deref();
- mTypeVersions.pop_back();
- }
- else
- break;
- }
- }
- void BfHotDepData::Deref()
- {
- mRefCount--;
- BF_ASSERT(mRefCount >= 0);
- if (mRefCount == 0)
- {
- switch (mDataKind)
- {
- case BfHotDepDataKind_TypeVersion:
- delete (BfHotTypeVersion*)this;
- break;
- case BfHotDepDataKind_ThisType:
- delete (BfHotThisType*)this;
- break;
- case BfHotDepDataKind_Allocation:
- delete (BfHotAllocation*)this;
- break;
- case BfHotDepDataKind_Method:
- delete (BfHotMethod*)this;
- break;
- case BfHotDepDataKind_DupMethod:
- delete (BfHotDupMethod*)this;
- break;
- case BfHotDepDataKind_DevirtualizedMethod:
- delete (BfHotDevirtualizedMethod*)this;
- break;
- case BfHotDepDataKind_InnerMethod:
- delete (BfHotInnerMethod*)this;
- break;
- case BfHotDepDataKind_FunctionPtr:
- delete (BfHotFunctionReference*)this;
- break;
- case BfHotDepDataKind_VirtualDecl:
- delete (BfHotVirtualDeclaration*)this;
- break;
- default:
- BF_FATAL("Not handled");
- }
- }
- }
- void BfHotMethod::Clear(bool keepDupMethods)
- {
- if (mPrevVersion != NULL)
- {
- mPrevVersion->Deref();
- mPrevVersion = NULL;
- }
- if (mSrcTypeVersion != NULL)
- {
- mSrcTypeVersion->Deref();
- mSrcTypeVersion = NULL;
- }
-
- if ((keepDupMethods) && ((mFlags & BfHotDepDataFlag_HasDup) != 0))
- {
- int writeIdx = 0;
- for (int i = 0; i < (int)mReferences.size(); i++)
- {
- auto depData = mReferences[i];
- if (depData->mDataKind == BfHotDepDataKind_DupMethod)
- {
- mReferences[writeIdx++] = depData;
- }
- else
- {
- depData->Deref();
- }
- }
- mReferences.mSize = writeIdx;
- }
- else
- {
- for (auto depData : mReferences)
- {
- depData->Deref();
- }
- mReferences.Clear();
- }
-
- }
- BfHotMethod::~BfHotMethod()
- {
- Clear();
- }
- //////////////////////////////////////////////////////////////////////////
- #pragma warning(disable:4146)
- // Only 63 chars - skip zero
- static const char cHash64bToChar[] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
- 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F',
- 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
- 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '_' };
- String BfTypeUtils::HashEncode64(uint64 val)
- {
- String outStr;
- if ((int64)val < 0)
- {
- uint64 flippedNum = (uint64)-(int64)val;
- // Only flip if the encoded result would actually be shorter
- if (flippedNum <= 0x00FFFFFFFFFFFFFFLL)
- {
- val = flippedNum;
- outStr.Append('_');
- }
- }
-
- for (int i = 0; i < 10; i++)
- {
- int charIdx = (int)((val >> (i * 6)) & 0x3F) - 1;
- if (charIdx != -1)
- outStr.Append(cHash64bToChar[charIdx]);
- }
- return outStr;
- }
- void BfTypeUtils::GetProjectList(BfType* checkType, Array<BfProject*>* projectList, int immutableLength)
- {
- if (checkType->IsBoxed())
- GetProjectList(((BfBoxedType*)checkType)->mElementType, projectList, immutableLength);
- BfTypeInstance* typeInst = checkType->ToTypeInstance();
- if (typeInst != NULL)
- {
- auto genericTypeInst = typeInst->ToGenericTypeInstance();
- if (genericTypeInst != NULL)
- {
- for (auto genericArg : genericTypeInst->mTypeGenericArguments)
- GetProjectList(genericArg, projectList, immutableLength);
- }
- BfProject* bfProject = typeInst->mTypeDef->mProject;
- if (std::find(projectList->begin(), projectList->end(), bfProject) == projectList->end())
- {
- bool handled = false;
- for (int idx = 0; idx < (int)projectList->size(); idx++)
- {
- auto checkProject = (*projectList)[idx];
- bool isBetter = bfProject->ContainsReference(checkProject);
- bool isWorse = checkProject->ContainsReference(bfProject);
- if (isBetter == isWorse)
- continue;
- if (isBetter)
- {
- if (idx >= immutableLength)
- {
- // This is even more specific, so replace with this one
- (*projectList)[idx] = bfProject;
- handled = true;
- }
- }
- else
- {
- // This is less specific, ignore
- handled = true;
- }
- break;
- }
- if (!handled)
- {
- projectList->push_back(bfProject);
- }
- }
- }
- else if (checkType->IsPointer())
- GetProjectList(((BfPointerType*)checkType)->mElementType, projectList, immutableLength);
- else if (checkType->IsRef())
- GetProjectList(((BfPointerType*)checkType)->mElementType, projectList, immutableLength);
- else if (checkType->IsSizedArray())
- GetProjectList(((BfSizedArrayType*)checkType)->mElementType, projectList, immutableLength);
- else if (checkType->IsMethodRef())
- GetProjectList(((BfMethodRefType*)checkType)->mOwner, projectList, immutableLength);
- }
- BfPrimitiveType* BfTypeUtils::GetPrimitiveType(BfModule* module, BfTypeCode typeCode)
- {
- return module->GetPrimitiveType(typeCode);
- }
- void BfTypeUtils::PopulateType(BfModule* module, BfType* type)
- {
- module->PopulateType(type);
- }
- String BfTypeUtils::TypeToString(BfTypeReference* typeRef)
- {
- if (auto typeDefTypeRef = BfNodeDynCast<BfDirectTypeDefReference>(typeRef))
- {
- if (!typeDefTypeRef->mTypeDef->mNamespace.IsEmpty())
- return typeDefTypeRef->mTypeDef->mNamespace.ToString() + "." + typeDefTypeRef->mTypeDef->mName->mString;
- else
- return String(typeDefTypeRef->mTypeDef->mName->mString);
- }
- if (typeRef->IsNamedTypeReference())
- {
- return typeRef->ToString();
- }
- if (auto ptrType = BfNodeDynCast<BfPointerTypeRef>(typeRef))
- return TypeToString(ptrType->mElementType) + "*";
- if (auto boxedType = BfNodeDynCast<BfBoxedTypeRef>(typeRef))
- return "boxed " + TypeToString(boxedType->mElementType);
- if (auto ptrType = BfNodeDynCast<BfArrayTypeRef>(typeRef))
- {
- String name = TypeToString(ptrType->mElementType) + "[";
- for (int i = 1; i < ptrType->mDimensions; i++)
- name += ",";
- name += "]";
- return name;
- }
- if (auto genericInstanceType = BfNodeDynCast<BfGenericInstanceTypeRef>(typeRef))
- {
- String name = TypeToString(genericInstanceType->mElementType);
- name += "<";
- for (int i = 0; i < (int)genericInstanceType->mGenericArguments.size(); i++)
- {
- if (i > 0)
- name += ", ";
- name += TypeToString(genericInstanceType->mGenericArguments[i]);
- }
- name += ">";
- return name;
- }
- if (auto genericParamTypeRef = BfNodeDynCast<BfGenericParamTypeRef>(typeRef))
- {
- if (genericParamTypeRef->mGenericParamKind == BfGenericParamKind_Method)
- return StrFormat("@M%d", genericParamTypeRef->mGenericParamIdx);
- return StrFormat("@T%d", genericParamTypeRef->mGenericParamIdx);
- }
- if (auto qualifiedTypeRef = BfNodeDynCast<BfQualifiedTypeReference>(typeRef))
- {
- return TypeToString(qualifiedTypeRef->mLeft) + "." + TypeToString(qualifiedTypeRef->mRight);
- }
- if (auto refTypeRef = BfNodeDynCast<BfRefTypeRef>(typeRef))
- {
- return ((refTypeRef->mRefToken->GetToken() == BfToken_Out) ? "out " : "ref ") +
- TypeToString(refTypeRef->mElementType);
- }
- if (auto directStrTypeName = BfNodeDynCast<BfDirectStrTypeReference>(typeRef))
- return directStrTypeName->mTypeName;
- BF_FATAL("Not implemented");
- return "???";
- }
- String BfTypeUtils::TypeToString(BfTypeDef* typeDef, BfTypeNameFlags typeNameFlags)
- {
- String str;
- TypeToString(str, typeDef, typeNameFlags);
- return str;
- }
- bool BfTypeUtils::TypeToString(StringImpl& str, BfTypeDef* typeDef, BfTypeNameFlags typeNameFlags)
- {
- auto checkTypeDef = typeDef;
- bool needsDot = false;
- if (checkTypeDef->mOuterType != NULL)
- {
- if (TypeToString(str, checkTypeDef->mOuterType, typeNameFlags))
- {
- needsDot = true;
- }
- }
- else
- {
- if (((typeNameFlags & BfTypeNameFlag_OmitNamespace) == 0) && (!typeDef->mNamespace.IsEmpty()))
- {
- typeDef->mNamespace.ToString(str);
- needsDot = true;
- }
- }
-
- if (((typeNameFlags & BfTypeNameFlag_HideGlobalName) != 0) && (typeDef->IsGlobalsContainer()))
- return false;
-
- if (needsDot)
- str += ".";
- typeDef->mName->ToString(str);
- if (typeDef->mGenericParamDefs.size() != 0)
- {
- int prevGenericParamCount = 0;
- if (checkTypeDef->mOuterType != NULL)
- prevGenericParamCount = (int)typeDef->mOuterType->mGenericParamDefs.size();
-
- if (prevGenericParamCount != (int)checkTypeDef->mGenericParamDefs.size())
- {
- str += "<";
- for (int i = prevGenericParamCount; i < (int)checkTypeDef->mGenericParamDefs.size(); i++)
- {
- if ((typeNameFlags & BfTypeNameFlag_InternalName) != 0)
- {
- if (i > prevGenericParamCount)
- str += ",";
- }
- else
- {
- if (i > prevGenericParamCount)
- str += ", ";
- str += checkTypeDef->mGenericParamDefs[i]->mName;
- }
- }
- str += ">";
- }
- }
- return true;
- }
- int BfTypeUtils::GetSplatCount(BfType* type)
- {
- int splatCount = 0;
- SplatIterate([&](BfType* checkType) { splatCount++; }, type);
- return splatCount;
- }
|