From: José Fonseca Date: Wed, 9 Feb 2011 15:15:08 +0000 (+0000) Subject: Don't leak all over the place. X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=ae9668b104e59ce074bc146dd70da93d0b3da3f9;p=apitrace Don't leak all over the place. --- diff --git a/dump.cpp b/dump.cpp index 5e85195..22f62e3 100644 --- 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(); } } diff --git a/glretrace.py b/glretrace.py index cda2357..8116826 100644 --- a/glretrace.py +++ b/glretrace.py @@ -290,6 +290,8 @@ static void display(void) { } retrace_call(*call); + + delete call; } // Reached the end of trace diff --git a/trace_model.cpp b/trace_model.cpp index 403c78e..4ac8a35 100644 --- a/trace_model.cpp +++ b/trace_model.cpp @@ -31,6 +31,31 @@ namespace Trace { +Call::~Call() { + for (unsigned i = 0; i < args.size(); ++i) { + delete args[i]; + } + + if (ret) { + delete ret; + } +} + + +Struct::~Struct() { + for (std::vector::iterator it = members.begin(); it != members.end(); ++it) { + delete *it; + } +} + + +Array::~Array() { + for (std::vector::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(node); if (c) - return c->value; + return c->sig->second; return node; } diff --git a/trace_model.hpp b/trace_model.hpp index a9256e9..57ebcaa 100644 --- a/trace_model.hpp +++ b/trace_model.hpp @@ -169,12 +169,13 @@ public: class Enum : public Value { public: - Enum(std::string &_name, Value *_value) : name(_name), value(_value) {} + typedef std::pair 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; diff --git a/trace_parser.hpp b/trace_parser.hpp index b401741..538ff6c 100644 --- a/trace_parser.hpp +++ b/trace_parser.hpp @@ -60,7 +60,7 @@ protected: typedef std::vector StructMap; StructMap structs; - typedef std::vector EnumMap; + typedef std::vector EnumMap; EnumMap enums; typedef std::vector 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() {