bool SymbolClassName::setBitSizeOfClassInstances() { bool aok = true; NodeBlockClass * classNode = getClassBlockNode(); assert(classNode); //infinite loop "Incomplete Class <> was never defined, fails sizing" m_state.pushClassContext(getUlamTypeIdx(), classNode, classNode, false, NULL); s32 totalbits = 0; aok = SymbolClass::trySetBitsizeWithUTIValues(totalbits); if(aok) { UTI cuti = getUlamTypeIdx(); m_state.setBitSize(cuti, totalbits); //"scalar" Class bitsize KEY ADJUSTED if(m_state.getBitSize(cuti) != totalbits) { std::ostringstream msg; msg << "CLASS (regular) '" << m_state.getUlamTypeNameByIndex(cuti).c_str(); msg << "' SIZED " << totalbits << " FAILED"; MSG(Symbol::getTokPtr(), msg.str().c_str(),ERR); classNode->setNodeType(Nav); //avoid assert in resolving loop } else { std::ostringstream msg; msg << "CLASS (regular) '" << m_state.getUlamTypeNameByIndex(cuti).c_str(); msg << "' SIZED: " << totalbits; MSG(Symbol::getTokPtr(), msg.str().c_str(),DEBUG); } } m_state.popClassContext(); //restore return aok; } //setBitSizeOfClassInstances
void SymbolClassName::resetUnseenClassLocation(Token identTok) { //during parsing Symbol::resetIdToken(identTok); NodeBlockClass * classNode = getClassBlockNode(); assert(classNode); classNode->setNodeLocation(identTok.m_locator); } //resetUnseenClassLocation
void SymbolClassName::generateCodeForClassInstances(FileManager * fm) { NodeBlockClass * classNode = getClassBlockNode(); assert(classNode); m_state.pushClassContext(getUlamTypeIdx(), classNode, classNode, false, NULL); SymbolClass::generateCode(fm); m_state.popClassContext(); //restore } //generateCodeForClassInstances
void SymbolClassName::testForClassInstances(File * fp) { NodeBlockClass * classNode = getClassBlockNode(); assert(classNode); m_state.pushClassContext(getUlamTypeIdx(), classNode, classNode, false, NULL); SymbolClass::testThisClass(fp); m_state.popClassContext(); //restore } //testForClassInstances
void SymbolClassName::packBitsForClassInstances() { NodeBlockClass * classNode = getClassBlockNode(); assert(classNode); m_state.pushClassContext(getUlamTypeIdx(), classNode, classNode, false, NULL); classNode->packBitsForVariableDataMembers(); m_state.popClassContext(); //restore } //packBitsForClassInstances
void SymbolClassName::checkCustomArraysOfClassInstances() { NodeBlockClass * classNode = getClassBlockNode(); assert(classNode); m_state.pushClassContext(getUlamTypeIdx(), classNode, classNode, false, NULL); classNode->checkCustomArrayTypeFunctions(); m_state.popClassContext(); //restore } //checkCustomArraysOfClassInstances()
void SymbolClassName::calcMaxDepthOfFunctionsForClassInstances() { NodeBlockClass * classNode = getClassBlockNode(); assert(classNode); m_state.pushClassContext(getUlamTypeIdx(), classNode, classNode, false, NULL); classNode->calcMaxDepthOfFunctions(); m_state.popClassContext(); //restore } //calcMaxDepthOfFunctionsForClassInstances
void SymbolClassName::buildDefaultValueForClassInstances() { NodeBlockClass * classNode = getClassBlockNode(); assert(classNode); m_state.pushClassContext(getUlamTypeIdx(), classNode, classNode, false, NULL); BV8K dval; SymbolClass::getDefaultValue(dval); //this instance m_state.popClassContext(); //restore } //buildDefaultValueForClassInstances
void SymbolClassName::checkAbstractInstanceErrorsForClassInstances() { NodeBlockClass * classNode = getClassBlockNode(); assert(classNode); m_state.pushClassContext(getUlamTypeIdx(), classNode, classNode, false, NULL); classNode->checkAbstractInstanceErrors(); m_state.popClassContext(); //restore return; } //checkAbstractInstanceErrorsForClassInstances
bool SymbolClassName::calcMaxIndexOfVirtualFunctionsForClassInstances() { NodeBlockClass * classNode = getClassBlockNode(); assert(classNode); m_state.pushClassContext(getUlamTypeIdx(), classNode, classNode, false, NULL); classNode->calcMaxIndexOfVirtualFunctions(); m_state.popClassContext(); //restore return (classNode->getVirtualMethodMaxIdx() != UNKNOWNSIZE); } //calcMaxIndexOfVirtualFunctionsForClassInstances
bool SymbolClassName::statusUnknownTypeNamesInClassInstances() { bool aok = true; NodeBlockClass * classNode = getClassBlockNode(); assert(classNode); m_state.pushClassContext(getUlamTypeIdx(), classNode, classNode, false, NULL); aok = SymbolClass::statusUnknownTypeNamesInClass(); m_state.popClassContext(); //restore return aok; } //statusUnknownTypeNamesInClassInstances
void SymbolClassName::countNavNodesInClassInstances(u32& ncnt, u32& hcnt, u32& nocnt) { assert(!isClassTemplate()); u32 navCounter = ncnt; u32 hzyCounter = hcnt; u32 unsetCounter = nocnt; NodeBlockClass * classNode = getClassBlockNode(); assert(classNode); m_state.pushClassContext(getUlamTypeIdx(), classNode, classNode, false, NULL); classNode->countNavHzyNoutiNodes(ncnt, hcnt, nocnt); if((ncnt - navCounter) > 0) { std::ostringstream msg; msg << navCounter << " data member nodes with erroneous types remain in class '"; msg << m_state.getUlamTypeNameBriefByIndex(getUlamTypeIdx()).c_str(); msg << "'"; MSG(classNode->getNodeLocationAsString().c_str(), msg.str().c_str(), INFO); } if((hcnt - hzyCounter) > 0) { std::ostringstream msg; msg << hzyCounter << " data member nodes with unresolved types remain in class '"; msg << m_state.getUlamTypeNameBriefByIndex(getUlamTypeIdx()).c_str(); msg << "'"; MSG(classNode->getNodeLocationAsString().c_str(), msg.str().c_str(), INFO); } if((nocnt - unsetCounter) > 0) { std::ostringstream msg; msg << unsetCounter << " data member nodes with unset types remain in class '"; msg << m_state.getUlamTypeNameBriefByIndex(getUlamTypeIdx()).c_str(); msg << "'"; MSG(classNode->getNodeLocationAsString().c_str(), msg.str().c_str(), INFO); } SymbolClass::countNavNodesInClassResolver(ncnt, hcnt, nocnt); m_state.popClassContext(); //restore return; } //countNavNodesInClassInstances
void SymbolClassName::updateLineageOfClass() { NodeBlockClass * classNode = getClassBlockNode(); if(!classNode) { std::ostringstream msg; msg << "LineageUpdate skipped for a class '"; msg << m_state.getUlamTypeNameByIndex(getUlamTypeIdx()).c_str(); msg << "' without a definition (maybe not a class at all)"; MSG(Symbol::getTokPtr(), msg.str().c_str(), ERR); return; } m_state.pushClassContext(getUlamTypeIdx(), classNode, classNode, false, NULL); classNode->updateLineage(0); m_state.popClassContext(); //restore } //updateLineageOfClass
void SymbolClassName::checkAndLabelClassFirst() { NodeBlockClass * classNode = getClassBlockNode(); if(!classNode) { std::ostringstream msg; msg << "Check and Label skipped for a class '"; msg << m_state.getUlamTypeNameByIndex(getUlamTypeIdx()).c_str(); msg << "' without a definition (maybe not a class at all)"; MSG(Symbol::getTokPtr(), msg.str().c_str(), ERR); return; } m_state.pushClassContext(getUlamTypeIdx(), classNode, classNode, false, NULL); classNode->checkAndLabelType(); m_state.popClassContext(); //restore } //checkAndLabelClassFirst()
Node * SymbolClassName::findNodeNoInAClassInstance(UTI instance, NNO n) { assert(getUlamTypeIdx() == instance); Node * foundNode = NULL; NodeBlockClass * classNode = getClassBlockNode(); assert(classNode); m_state.pushClassContext(getUlamTypeIdx(), classNode, classNode, false, NULL); classNode->findNodeNo(n, foundNode); //if not in the tree, ask the resolver if(!foundNode) { SymbolClass::findNodeNoInResolver(n, foundNode); } m_state.popClassContext(); //restore return foundNode; } //findNodeNoInAClassInstance
u32 SymbolClassName::countNavNodesInClassInstances() { assert(!isClassTemplate()); u32 navCounter = 0; NodeBlockClass * classNode = getClassBlockNode(); assert(classNode); m_state.pushClassContext(getUlamTypeIdx(), classNode, classNode, false, NULL); classNode->countNavNodes(navCounter); if(navCounter > 0) { std::ostringstream msg; msg << navCounter << " data member nodes with unresolved types remain in class '"; msg << m_state.getUlamTypeNameBriefByIndex(getUlamTypeIdx()).c_str(); msg << "'"; MSG(classNode->getNodeLocationAsString().c_str(), msg.str().c_str(), WARN); } m_state.popClassContext(); //restore return navCounter; } //countNavNodesInClassInstances