aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/xmlparser.cpp6
-rw-r--r--common/xmlparser.h16
2 files changed, 18 insertions, 4 deletions
diff --git a/common/xmlparser.cpp b/common/xmlparser.cpp
index 6c1aa7d0e4..44274f7c8d 100644
--- a/common/xmlparser.cpp
+++ b/common/xmlparser.cpp
@@ -188,7 +188,7 @@ bool XMLParser::closeKey() {
if (ignore == false)
result = closedKeyCallback(_activeKey.top());
- delete _activeKey.pop();
+ freeNode(_activeKey.pop());
return result;
}
@@ -202,7 +202,7 @@ bool XMLParser::parse() {
buildLayout();
while (!_activeKey.empty())
- delete _activeKey.pop();
+ freeNode(_activeKey.pop());
cleanup();
@@ -253,7 +253,7 @@ bool XMLParser::parse() {
break;
}
} else {
- ParserNode *node = new ParserNode;
+ ParserNode *node = allocNode(); //new ParserNode;
node->name = _token;
node->ignore = false;
node->depth = _activeKey.size();
diff --git a/common/xmlparser.h b/common/xmlparser.h
index 4b76278d47..ad9ad799f0 100644
--- a/common/xmlparser.h
+++ b/common/xmlparser.h
@@ -47,6 +47,8 @@ namespace Common {
External documentation available at:
http://www.smartlikearoboc.com/scummvm_doc/xmlparser_doc.html
*/
+
+#define MAX_XML_DEPTH 8
#define XML_KEY(keyName) {\
lay = new CustomXMLKeyLayout;\
@@ -112,7 +114,7 @@ public:
virtual ~XMLParser() {
while (!_activeKey.empty())
- delete _activeKey.pop();
+ freeNode(_activeKey.pop());
delete _XMLkeys;
delete _stream;
@@ -166,6 +168,18 @@ public:
int depth;
XMLKeyLayout *layout;
};
+
+ FixedSizeMemoryPool<sizeof(ParserNode), MAX_XML_DEPTH> _nodePool;
+
+ ParserNode *allocNode() {
+ void* mem = _nodePool.malloc();
+ return new (mem) ParserNode;
+ }
+
+ void freeNode(ParserNode *node) {
+ node->~ParserNode();
+ _nodePool.free(node);
+ }
/**
* Loads a file into the parser.