コード例 #1
0
  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
コード例 #2
0
 void SymbolClassName::resetUnseenClassLocation(Token identTok)
 {
   //during parsing
   Symbol::resetIdToken(identTok);
   NodeBlockClass * classNode = getClassBlockNode();
   assert(classNode);
   classNode->setNodeLocation(identTok.m_locator);
 } //resetUnseenClassLocation
コード例 #3
0
  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
コード例 #4
0
  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
コード例 #5
0
  void SymbolClassName::packBitsForClassInstances()
  {
    NodeBlockClass * classNode = getClassBlockNode();
    assert(classNode);
    m_state.pushClassContext(getUlamTypeIdx(), classNode, classNode, false, NULL);

    classNode->packBitsForVariableDataMembers();
    m_state.popClassContext(); //restore
  } //packBitsForClassInstances
コード例 #6
0
  void SymbolClassName::checkCustomArraysOfClassInstances()
  {
    NodeBlockClass * classNode = getClassBlockNode();
    assert(classNode);
    m_state.pushClassContext(getUlamTypeIdx(), classNode, classNode, false, NULL);

    classNode->checkCustomArrayTypeFunctions();
    m_state.popClassContext(); //restore
  } //checkCustomArraysOfClassInstances()
コード例 #7
0
  void SymbolClassName::calcMaxDepthOfFunctionsForClassInstances()
  {
    NodeBlockClass * classNode = getClassBlockNode();
    assert(classNode);
    m_state.pushClassContext(getUlamTypeIdx(), classNode, classNode, false, NULL);

    classNode->calcMaxDepthOfFunctions();
    m_state.popClassContext(); //restore
  } //calcMaxDepthOfFunctionsForClassInstances
コード例 #8
0
ファイル: SymbolClassName.cpp プロジェクト: StStep/ULAM
  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
コード例 #9
0
ファイル: SymbolClassName.cpp プロジェクト: StStep/ULAM
  void SymbolClassName::checkAbstractInstanceErrorsForClassInstances()
  {
    NodeBlockClass * classNode = getClassBlockNode();
    assert(classNode);
    m_state.pushClassContext(getUlamTypeIdx(), classNode, classNode, false, NULL);

    classNode->checkAbstractInstanceErrors();
    m_state.popClassContext(); //restore
    return;
  } //checkAbstractInstanceErrorsForClassInstances
コード例 #10
0
ファイル: SymbolClassName.cpp プロジェクト: StStep/ULAM
  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
コード例 #11
0
ファイル: SymbolClassName.cpp プロジェクト: StStep/ULAM
  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
コード例 #12
0
ファイル: SymbolClassName.cpp プロジェクト: StStep/ULAM
  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
コード例 #13
0
  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
コード例 #14
0
  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()
コード例 #15
0
  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
コード例 #16
0
  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