UTI NodeConstant::checkAndLabelType() { UTI it = Nav; bool stubcopy = m_state.isClassAStub(m_state.getCompileThisIdx()); //instantiate, look up in class block; skip if stub copy and already ready. if(!stubcopy && m_constSymbol == NULL) checkForSymbol(); else { stubcopy = m_state.hasClassAStub(m_state.getCompileThisIdx()); //includes ancestors } if(m_constSymbol) { it = m_constSymbol->getUlamTypeIdx(); } else if(isReadyConstant() && stubcopy) { assert(m_state.okUTItoContinue(m_constType)); setNodeType(m_constType); //t3565, t3640, t3641, t3642, t3652 //stub copy case: still wants uti mapping it = NodeTerminal::checkAndLabelType(); } else if(stubcopy) { // still need its symbol for a value // use the member class (unlike checkForSymbol) } // map incomplete UTI if(!m_state.isComplete(it)) //reloads to recheck { std::ostringstream msg; msg << "Incomplete " << prettyNodeName().c_str() << " for type: "; msg << m_state.getUlamTypeNameBriefByIndex(it).c_str(); msg << ", used with constant symbol name '"; msg << m_state.getTokenDataAsString(m_token).c_str() << "'"; MSG(getNodeLocationAsString().c_str(), msg.str().c_str(), WAIT); //wait until updateConstant tried. } setNodeType(it); Node::setStoreIntoAble(TBOOL_FALSE); //copy m_constant from Symbol into NodeTerminal parent. if(!isReadyConstant()) m_ready = updateConstant(); //sets ready here if(!isReadyConstant()) { it = Hzy; if(!stubcopy) m_constSymbol = NULL; //lookup again too! (e.g. inherited template instances) m_state.setGoAgain(); } return it; } //checkAndLabelType
void NodeConstantArray::checkForSymbol() { //in case of a cloned unknown NodeBlock * currBlock = getBlock(); m_state.pushCurrentBlockAndDontUseMemberBlock(currBlock); Symbol * asymptr = NULL; bool hazyKin = false; if(m_state.alreadyDefinedSymbol(m_token.m_dataindex, asymptr, hazyKin)) { if(asymptr->isConstant()) { m_constSymbol = (SymbolConstantValue *) asymptr; } else { std::ostringstream msg; msg << "(1) <" << m_state.getTokenDataAsString(m_token).c_str(); msg << "> is not a constant, and cannot be used as one with class: "; msg << m_state.getUlamTypeNameBriefByIndex(m_state.getCompileThisIdx()).c_str(); MSG(getNodeLocationAsString().c_str(), msg.str().c_str(), ERR); } } else { std::ostringstream msg; msg << "Named Constant Array <" << m_state.getTokenDataAsString(m_token).c_str(); msg << "> is not defined, or was used before declared in a function"; if(!hazyKin) MSG(getNodeLocationAsString().c_str(), msg.str().c_str(), ERR); else MSG(getNodeLocationAsString().c_str(), msg.str().c_str(), DEBUG); } m_state.popClassContext(); //restore if(m_constSymbol && !m_constSymbol->isDataMember() && !m_constSymbol->isLocalsFilescopeDef() && !m_constSymbol->isClassArgument() && (m_constSymbol->getDeclNodeNo() > getNodeNo())) { NodeBlock * currBlock = getBlock(); currBlock = currBlock->getPreviousBlockPointer(); std::ostringstream msg; msg << "Named constant array '" << getName(); msg << "' was used before declared in a function"; if(currBlock) { MSG(getNodeLocationAsString().c_str(), msg.str().c_str(), WAIT); setBlockNo(currBlock->getNodeNo()); m_constSymbol = NULL; return checkForSymbol(); } else { MSG(getNodeLocationAsString().c_str(), msg.str().c_str(), ERR); m_constSymbol = NULL; } } } //checkForSymbol
UTI NodeTypedef::checkAndLabelType() { UTI it = Nav; // instantiate, look up in current block if(m_typedefSymbol == NULL) checkForSymbol(); if(m_typedefSymbol) { //m_typedefSymbol is the (rhs) type alias it = m_typedefSymbol->getUlamTypeIdx(); //check for UNSEEN Class' ClassType (e.g. array of UC_QUARK) UlamType * tdut = m_state.getUlamTypeByIndex(it); if((tdut->getUlamTypeEnum() == Class) && (tdut->getUlamClassType() == UC_UNSEEN)) { if(!m_state.completeIncompleteClassSymbolForTypedef(it)) { std::ostringstream msg; msg << "Incomplete Typedef for class type: "; msg << m_state.getUlamTypeNameBriefByIndex(it).c_str(); msg << ", used with variable symbol name <" << getName() << ">"; MSG(getNodeLocationAsString().c_str(), msg.str().c_str(), WAIT); } } else if(tdut->isHolder() && !m_state.isThisLocalsFileScope()) { m_state.statusUnknownTypeInThisClassResolver(it); } UTI cuti = m_state.getCompileThisIdx(); if(m_nodeTypeDesc) { UTI duti = m_nodeTypeDesc->checkAndLabelType(); //sets goagain if nav if(m_state.okUTItoContinue(duti) && (duti != it)) { std::ostringstream msg; msg << "REPLACING Symbol UTI" << it; msg << ", " << m_state.getUlamTypeNameBriefByIndex(it).c_str(); msg << " used with typedef symbol name '" << getName(); msg << "' with node type descriptor type: "; msg << m_state.getUlamTypeNameBriefByIndex(duti).c_str(); msg << " UTI" << duti << " while labeling class: "; msg << m_state.getUlamTypeNameBriefByIndex(cuti).c_str(); MSG(getNodeLocationAsString().c_str(), msg.str().c_str(), DEBUG); m_state.mapTypesInCurrentClass(it, duti); m_state.updateUTIAliasForced(it, duti); //t3379 m_typedefSymbol->resetUlamType(duti); //consistent! (must be same ref type) it = duti; } } if(!m_state.okUTItoContinue(it) || !m_state.isComplete(it)) //reloads { std::ostringstream msg; msg << "Incomplete Typedef for type: "; msg << m_state.getUlamTypeNameBriefByIndex(it).c_str(); msg << ", used with typedef symbol name '" << getName() << "'"; if(m_state.okUTItoContinue(it) || (it == Hzy)) { MSG(getNodeLocationAsString().c_str(), msg.str().c_str(), WAIT); m_state.setGoAgain(); //since not error; unlike vardecl } else MSG(getNodeLocationAsString().c_str(), msg.str().c_str(), ERR); } } // got typedef symbol setNodeType(it); return getNodeType(); } //checkAndLabelType
UTI NodeConstantArray::checkAndLabelType() { UTI it = Nav; bool stubcopy = m_state.isClassAStub(m_state.getCompileThisIdx()); //instantiate, look up in class block; skip if stub copy and already ready. if(!stubcopy && m_constSymbol == NULL) checkForSymbol(); else stubcopy = m_state.hasClassAStub(m_state.getCompileThisIdx()); //includes ancestors if(m_constSymbol) it = m_constSymbol->getUlamTypeIdx(); else if(stubcopy) { assert(m_state.okUTItoContinue(m_constType)); setNodeType(m_constType); //t3565, t3640, t3641, t3642, t3652 //stub copy case: still wants uti mapping it = m_constType; } // map incomplete UTI if(!m_state.isComplete(it)) //reloads to recheck { UTI mappedUTI = it; if(m_state.findaUTIAlias(it, mappedUTI)) { std::ostringstream msg; msg << "REPLACE " << prettyNodeName().c_str() << " for type: "; msg << m_state.getUlamTypeNameBriefByIndex(it).c_str(); msg << ", used with alias type: "; msg << m_state.getUlamTypeNameBriefByIndex(it).c_str(); MSG(getNodeLocationAsString().c_str(), msg.str().c_str(), DEBUG); it = mappedUTI; } if(!m_state.isComplete(it)) //reloads to recheck { std::ostringstream msg; msg << "Incomplete " << prettyNodeName().c_str() << " for type: "; msg << m_state.getUlamTypeNameBriefByIndex(it).c_str(); msg << ", used with constant symbol name '"; msg << m_state.getTokenDataAsString(m_token).c_str() << "'"; MSG(getNodeLocationAsString().c_str(), msg.str().c_str(), WAIT); //wait until updateConstant tried. } } setNodeType(it); Node::setStoreIntoAble(TBOOL_FALSE); if(!isReadyConstant()) { it = Hzy; if(!stubcopy) m_constSymbol = NULL; //lookup again too! (e.g. inherited template instances) m_state.setGoAgain(); } return it; } //checkAndLabelType