Improve readability of Library::load()

by caching often used node names.

Also constify existing name caches.
This commit is contained in:
Thomas Jarosch 2014-12-12 22:16:20 +01:00
parent 524828a49b
commit 2f1ba89567
1 changed files with 31 additions and 27 deletions

View File

@ -117,7 +117,7 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
return Error(UNSUPPORTED_FORMAT); return Error(UNSUPPORTED_FORMAT);
for (const tinyxml2::XMLElement *node = rootnode->FirstChildElement(); node; node = node->NextSiblingElement()) { for (const tinyxml2::XMLElement *node = rootnode->FirstChildElement(); node; node = node->NextSiblingElement()) {
std::string nodename = node->Name(); const std::string nodename = node->Name();
if (nodename == "memory" || nodename == "resource") { if (nodename == "memory" || nodename == "resource") {
// get allocationId to use.. // get allocationId to use..
int allocationId = 0; int allocationId = 0;
@ -131,7 +131,7 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
} }
} }
if (allocationId == 0) { if (allocationId == 0) {
if (strcmp(node->Name(), "memory")==0) if (nodename == "memory")
while (!ismemory(++allocid)); while (!ismemory(++allocid));
else else
while (!isresource(++allocid)); while (!isresource(++allocid));
@ -140,18 +140,19 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
// add alloc/dealloc/use functions.. // add alloc/dealloc/use functions..
for (const tinyxml2::XMLElement *memorynode = node->FirstChildElement(); memorynode; memorynode = memorynode->NextSiblingElement()) { for (const tinyxml2::XMLElement *memorynode = node->FirstChildElement(); memorynode; memorynode = memorynode->NextSiblingElement()) {
if (strcmp(memorynode->Name(),"alloc")==0) { const std::string memorynodename = memorynode->Name();
if (memorynodename == "alloc") {
_alloc[memorynode->GetText()] = allocationId; _alloc[memorynode->GetText()] = allocationId;
const char *init = memorynode->Attribute("init"); const char *init = memorynode->Attribute("init");
if (init && strcmp(init,"false")==0) { if (init && strcmp(init,"false")==0) {
returnuninitdata.insert(memorynode->GetText()); returnuninitdata.insert(memorynode->GetText());
} }
} else if (strcmp(memorynode->Name(),"dealloc")==0) } else if (memorynodename == "dealloc")
_dealloc[memorynode->GetText()] = allocationId; _dealloc[memorynode->GetText()] = allocationId;
else if (strcmp(memorynode->Name(),"use")==0) else if (memorynodename == "use")
use.insert(memorynode->GetText()); use.insert(memorynode->GetText());
else else
return Error(BAD_ELEMENT, memorynode->Name()); return Error(BAD_ELEMENT, memorynodename);
} }
} }
@ -176,7 +177,7 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
std::string name = name_char; std::string name = name_char;
for (const tinyxml2::XMLElement *functionnode = node->FirstChildElement(); functionnode; functionnode = functionnode->NextSiblingElement()) { for (const tinyxml2::XMLElement *functionnode = node->FirstChildElement(); functionnode; functionnode = functionnode->NextSiblingElement()) {
std::string functionnodename = functionnode->Name(); const std::string functionnodename = functionnode->Name();
if (functionnodename == "noreturn") if (functionnodename == "noreturn")
_noreturn[name] = (strcmp(functionnode->GetText(), "true") == 0); _noreturn[name] = (strcmp(functionnode->GetText(), "true") == 0);
else if (functionnodename == "pure") else if (functionnodename == "pure")
@ -199,7 +200,7 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
std::string& valid = argumentChecks[name][nr].valid; std::string& valid = argumentChecks[name][nr].valid;
std::list<ArgumentChecks::MinSize>& minsizes = argumentChecks[name][nr].minsizes; std::list<ArgumentChecks::MinSize>& minsizes = argumentChecks[name][nr].minsizes;
for (const tinyxml2::XMLElement *argnode = functionnode->FirstChildElement(); argnode; argnode = argnode->NextSiblingElement()) { for (const tinyxml2::XMLElement *argnode = functionnode->FirstChildElement(); argnode; argnode = argnode->NextSiblingElement()) {
std::string argnodename = argnode->Name(); const std::string argnodename = argnode->Name();
if (argnodename == "not-bool") if (argnodename == "not-bool")
notbool = true; notbool = true;
else if (argnodename == "not-null") else if (argnodename == "not-null")
@ -271,7 +272,7 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
} }
else else
return Error(BAD_ATTRIBUTE, argnode->Name()); return Error(BAD_ATTRIBUTE, argnodename);
} }
argumentChecks[name][nr].notbool = notbool; argumentChecks[name][nr].notbool = notbool;
argumentChecks[name][nr].notnull = notnull; argumentChecks[name][nr].notnull = notnull;
@ -285,7 +286,7 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
const tinyxml2::XMLAttribute* secure = functionnode->FindAttribute("secure"); const tinyxml2::XMLAttribute* secure = functionnode->FindAttribute("secure");
_formatstr[name] = std::make_pair(scan && scan->BoolValue(), secure && secure->BoolValue()); _formatstr[name] = std::make_pair(scan && scan->BoolValue(), secure && secure->BoolValue());
} else } else
return Error(BAD_ELEMENT, functionnode->Name()); return Error(BAD_ELEMENT, functionnodename);
} }
} }
@ -314,7 +315,7 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
_processAfterCode[extension] = (aftercode && strcmp(aftercode, "true") == 0); _processAfterCode[extension] = (aftercode && strcmp(aftercode, "true") == 0);
for (const tinyxml2::XMLElement *markupnode = node->FirstChildElement(); markupnode; markupnode = markupnode->NextSiblingElement()) { for (const tinyxml2::XMLElement *markupnode = node->FirstChildElement(); markupnode; markupnode = markupnode->NextSiblingElement()) {
std::string markupnodename = markupnode->Name(); const std::string markupnodename = markupnode->Name();
if (markupnodename == "keywords") { if (markupnodename == "keywords") {
for (const tinyxml2::XMLElement *librarynode = markupnode->FirstChildElement(); librarynode; librarynode = librarynode->NextSiblingElement()) { for (const tinyxml2::XMLElement *librarynode = markupnode->FirstChildElement(); librarynode; librarynode = librarynode->NextSiblingElement()) {
if (strcmp(librarynode->Name(), "keyword") == 0) { if (strcmp(librarynode->Name(), "keyword") == 0) {
@ -337,12 +338,13 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
return Error(MISSING_ATTRIBUTE, "prefix"); return Error(MISSING_ATTRIBUTE, "prefix");
for (const tinyxml2::XMLElement *e = exporter->FirstChildElement(); e; e = e->NextSiblingElement()) { for (const tinyxml2::XMLElement *e = exporter->FirstChildElement(); e; e = e->NextSiblingElement()) {
if (strcmp(e->Name(), "prefix") == 0) const std::string ename = e->Name();
if (ename == "prefix")
_exporters[prefix].addPrefix(e->GetText()); _exporters[prefix].addPrefix(e->GetText());
else if (strcmp(e->Name(), "suffix") == 0) else if (ename == "suffix")
_exporters[prefix].addSuffix(e->GetText()); _exporters[prefix].addSuffix(e->GetText());
else else
return Error(BAD_ELEMENT, e->Name()); return Error(BAD_ELEMENT, ename);
} }
} }
} }
@ -358,11 +360,12 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
else if (markupnodename == "codeblocks") { else if (markupnodename == "codeblocks") {
for (const tinyxml2::XMLElement *blocknode = markupnode->FirstChildElement(); blocknode; blocknode = blocknode->NextSiblingElement()) { for (const tinyxml2::XMLElement *blocknode = markupnode->FirstChildElement(); blocknode; blocknode = blocknode->NextSiblingElement()) {
if (strcmp(blocknode->Name(), "block") == 0) { const std::string blocknodename = blocknode->Name();
if (blocknodename == "block") {
const char * blockName = blocknode->Attribute("name"); const char * blockName = blocknode->Attribute("name");
if (blockName) if (blockName)
_executableblocks[extension].addBlock(blockName); _executableblocks[extension].addBlock(blockName);
} else if (strcmp(blocknode->Name(), "structure") == 0) { } else if (blocknodename == "structure") {
const char * start = blocknode->Attribute("start"); const char * start = blocknode->Attribute("start");
if (start) if (start)
_executableblocks[extension].setStart(start); _executableblocks[extension].setStart(start);
@ -375,12 +378,12 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
} }
else else
return Error(BAD_ELEMENT, blocknode->Name()); return Error(BAD_ELEMENT, blocknodename);
} }
} }
else else
return Error(BAD_ELEMENT, markupnode->Name()); return Error(BAD_ELEMENT, markupnodename);
} }
} }
@ -409,25 +412,26 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
type._type = value; type._type = value;
std::set<std::string> platform; std::set<std::string> platform;
for (const tinyxml2::XMLElement *typenode = node->FirstChildElement(); typenode; typenode = typenode->NextSiblingElement()) { for (const tinyxml2::XMLElement *typenode = node->FirstChildElement(); typenode; typenode = typenode->NextSiblingElement()) {
if (strcmp(typenode->Name(), "platform") == 0) { const std::string typenodename = typenode->Name();
if (typenodename == "platform") {
const char * const type_attribute = typenode->Attribute("type"); const char * const type_attribute = typenode->Attribute("type");
if (type_attribute == nullptr) if (type_attribute == nullptr)
return Error(MISSING_ATTRIBUTE, "type"); return Error(MISSING_ATTRIBUTE, "type");
platform.insert(type_attribute); platform.insert(type_attribute);
} else if (strcmp(typenode->Name(), "signed") == 0) } else if (typenodename == "signed")
type._signed = true; type._signed = true;
else if (strcmp(typenode->Name(), "unsigned") == 0) else if (typenodename == "unsigned")
type._unsigned = true; type._unsigned = true;
else if (strcmp(typenode->Name(), "long") == 0) else if (typenodename == "long")
type._long = true; type._long = true;
else if (strcmp(typenode->Name(), "pointer") == 0) else if (typenodename == "pointer")
type._pointer= true; type._pointer= true;
else if (strcmp(typenode->Name(), "ptr_ptr") == 0) else if (typenodename == "ptr_ptr")
type._ptr_ptr = true; type._ptr_ptr = true;
else if (strcmp(typenode->Name(), "const_ptr") == 0) else if (typenodename == "const_ptr")
type._const_ptr = true; type._const_ptr = true;
else else
return Error(BAD_ELEMENT, typenode->Name()); return Error(BAD_ELEMENT, typenodename);
} }
if (platform.empty()) { if (platform.empty()) {
const PlatformType * const type_ptr = platform_type(type_name, ""); const PlatformType * const type_ptr = platform_type(type_name, "");
@ -452,7 +456,7 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
} }
else else
return Error(BAD_ELEMENT, node->Name()); return Error(BAD_ELEMENT, nodename);
} }
return Error(OK); return Error(OK);
} }