]> git.cworth.org Git - apitrace/commitdiff
Don't leak all over the place.
authorJosé Fonseca <jfonseca@vmware.com>
Wed, 9 Feb 2011 15:15:08 +0000 (15:15 +0000)
committerJosé Fonseca <jfonseca@vmware.com>
Wed, 9 Feb 2011 15:15:08 +0000 (15:15 +0000)
dump.cpp
glretrace.py
trace_model.cpp
trace_model.hpp
trace_parser.hpp

index 5e85195c570cdecb5247bf197d70068775455614..22f62e3692c5ce45857b86df235615dd99db9f49 100644 (file)
--- a/dump.cpp
+++ b/dump.cpp
@@ -41,6 +41,7 @@ int main(int argc, char **argv)
             call = p.parse_call();
             while (call) {
                 std::cout << *call;
+                delete call;
                 call = p.parse_call();
             }
         }
index cda23570891ce6320ee3b3f750b329fb2dc5bb3f..8116826d0f2dceba15c7113551b52f308e7bda64 100644 (file)
@@ -290,6 +290,8 @@ static void display(void) {
         }
         
         retrace_call(*call);
+
+        delete call;
     }
 
     // Reached the end of trace
index 403c78ea0382c38d08fe5fdb4caef20fcfb0cb08..4ac8a35078158a78e1d022c5cf7270c756c9bfdf 100644 (file)
 namespace Trace {
 
 
+Call::~Call() {
+    for (unsigned i = 0; i < args.size(); ++i) {
+        delete args[i];
+    }
+
+    if (ret) {
+        delete ret;
+    }
+}
+
+
+Struct::~Struct() {
+    for (std::vector<Value *>::iterator it = members.begin(); it != members.end(); ++it) {
+        delete *it;
+    }
+}
+
+
+Array::~Array() {
+    for (std::vector<Value *>::iterator it = values.begin(); it != values.end(); ++it) {
+        delete *it;
+    }
+}
+
+
 void Null::visit(Visitor &visitor) { visitor.visit(this); }
 void Bool::visit(Visitor &visitor) { visitor.visit(this); } 
 void SInt::visit(Visitor &visitor) { visitor.visit(this); } 
@@ -44,6 +69,7 @@ void Array::visit(Visitor &visitor) { visitor.visit(this); }
 void Blob::visit(Visitor &visitor) { visitor.visit(this); } 
 void Pointer::visit(Visitor &visitor) { visitor.visit(this); }
 
+
 class Dumper : public Visitor
 {
 protected:
@@ -102,7 +128,7 @@ public:
     }
 
     void visit(Enum *node) {
-        os << literal << node->name << normal;
+        os << literal << node->sig->first << normal;
     }
 
     void visit(Bitmask *bitmask) {
@@ -194,7 +220,7 @@ std::ostream & operator <<(std::ostream &os, Value *value) {
 static inline const Value *unwrap(const Value *node) {
     const Enum *c = dynamic_cast<const Enum *>(node);
     if (c)
-        return c->value;
+        return c->sig->second;
     return node;
 }
 
index a9256e9dfbb7db1d9a58a16d7dd3685a2e245b09..57ebcaa666ea2f82d3fe19bf5e24e43e09f8732d 100644 (file)
@@ -169,12 +169,13 @@ public:
 class Enum : public Value
 {
 public:
-    Enum(std::string &_name, Value *_value) : name(_name), value(_value) {}
+    typedef std::pair<std::string, Value *> Signature;
+
+    Enum(const Signature *_sig) : sig(_sig) {}
 
     void visit(Visitor &visitor);
 
-    std::string name;
-    Value *value;
+    const Signature *sig;
 };
 
 
@@ -201,6 +202,7 @@ public:
     };
 
     Struct(Signature *_sig) : sig(_sig), members(_sig->member_names.size()) { }
+    ~Struct();
 
     void visit(Visitor &visitor);
 
@@ -213,6 +215,7 @@ class Array : public Value
 {
 public:
     Array(size_t len) : values(len) {}
+    ~Array();
 
     void visit(Visitor &visitor);
 
@@ -295,6 +298,7 @@ public:
     Value *ret;
 
     Call(Signature *_sig) : sig(_sig), args(_sig->arg_names.size()), ret(0) { }
+    ~Call();
 
     inline const std::string name(void) const {
         return sig->name;
index b4017414da646926737a0489ea9f987bd68d0b60..538ff6c49f57bf8447aacb6806d84895a2b36957 100644 (file)
@@ -60,7 +60,7 @@ protected:
     typedef std::vector<Struct::Signature *> StructMap;
     StructMap structs;
 
-    typedef std::vector<Enum *> EnumMap;
+    typedef std::vector<Enum::Signature *> EnumMap;
     EnumMap enums;
 
     typedef std::vector<Bitmask::Signature *> BitmaskMap;
@@ -275,15 +275,15 @@ public:
 
     Value *parse_enum() {
         size_t id = read_uint();
-        Enum *sig = lookup(enums, id);
+        Enum::Signature *sig = lookup(enums, id);
         if (!sig) {
             std::string name = read_string();
             Value *value = parse_value();
-            sig = new Enum(name, value);
+            sig = new Enum::Signature(name, value);
             enums[id] = sig;
         }
         assert(sig);
-        return sig;
+        return new Enum(sig);
     }
 
     Value *parse_bitmask() {