From b1887f9c55f7017b795bfc4b2d9a70e45e5f1e77 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Sun, 21 Nov 2010 02:33:38 +0000 Subject: [PATCH] Handle null more consistently. --- log.cpp | 9 +++------ trace_format.hpp | 5 +++-- trace_model.cpp | 20 +++++++++++++------- trace_model.hpp | 4 ++-- trace_parser.hpp | 12 +++++++----- 5 files changed, 28 insertions(+), 22 deletions(-) diff --git a/log.cpp b/log.cpp index 5ffc372..5ef3a76 100644 --- a/log.cpp +++ b/log.cpp @@ -192,7 +192,7 @@ void BeginBitmask(const char *type) { } void EndBitmask(void) { - WriteByte(Trace::TYPE_VOID); + WriteByte(Trace::TYPE_NULL); } void BeginPointer(const char *type, const void *addr) @@ -204,8 +204,7 @@ void BeginPointer(const char *type, const void *addr) void EndPointer(void) { } void LiteralBool(bool value) { - WriteByte(Trace::TYPE_BOOL); - WriteByte(value ? 0 : 1); + WriteByte(value ? Trace::TYPE_TRUE : Trace::TYPE_FALSE); } void LiteralSInt(signed long long value) { @@ -270,9 +269,7 @@ void LiteralNamedConstant(const char *name, long long value) { } void LiteralNull(void) { - WriteByte(Trace::TYPE_POINTER); - WriteUInt(0); - WriteByte(Trace::TYPE_OPAQUE); + WriteByte(Trace::TYPE_NULL); } void LiteralOpaque(void) { diff --git a/trace_format.hpp b/trace_format.hpp index fe37a80..a67acc0 100644 --- a/trace_format.hpp +++ b/trace_format.hpp @@ -38,8 +38,9 @@ enum CallDetail { }; enum Type { - TYPE_VOID = 0, - TYPE_BOOL, + TYPE_NULL = 0, + TYPE_FALSE, + TYPE_TRUE, TYPE_SINT, TYPE_UINT, TYPE_FLOAT, diff --git a/trace_model.cpp b/trace_model.cpp index be2293d..ee711ed 100644 --- a/trace_model.cpp +++ b/trace_model.cpp @@ -30,7 +30,7 @@ namespace Trace { -void Void::visit(Visitor &visitor) { +void Null::visit(Visitor &visitor) { visitor.visit(this); } @@ -76,7 +76,8 @@ public: Dumper(std::ostream &_os) : os(_os) {} - void visit(Void *node) { + void visit(Null *node) { + os << "NULL"; } void visit(Bool *node) { @@ -163,7 +164,7 @@ Value::operator double(void) const { return fl->value; } -static Void void_; +static Null null; const Value & Value::operator[](size_t index) const { const Array *array = dynamic_cast(unwrap(this)); @@ -172,13 +173,18 @@ const Value & Value::operator[](size_t index) const { return *array->values[index]; } } - return void_; + return null; } Value::operator void *(void) const { const Blob *blob = dynamic_cast(unwrap(this)); - assert(blob); - return blob->buf; + if (blob) + return blob->buf; + const Null *null = dynamic_cast(unwrap(this)); + if (null); + return NULL; + assert(0); + return NULL; } Value & Call::arg(const char *name) { @@ -187,7 +193,7 @@ Value & Call::arg(const char *name) { return *it->second; } } - return void_; + return null; } std::ostream & operator <<(std::ostream &os, Call &call) { diff --git a/trace_model.hpp b/trace_model.hpp index 8089880..d80b2f9 100644 --- a/trace_model.hpp +++ b/trace_model.hpp @@ -94,7 +94,7 @@ public: }; -class Void : public Value +class Null : public Value { public: void visit(Visitor &visitor); @@ -201,7 +201,7 @@ public: class Visitor { public: - virtual void visit(Void *) {assert(0);} + virtual void visit(Null *) {assert(0);} virtual void visit(Bool *) {assert(0);} virtual void visit(SInt *) {assert(0);} virtual void visit(UInt *) {assert(0);} diff --git a/trace_parser.hpp b/trace_parser.hpp index 674ee8e..565ccaa 100644 --- a/trace_parser.hpp +++ b/trace_parser.hpp @@ -111,8 +111,10 @@ public: int c; c = gzgetc(file); switch(c) { - case Trace::TYPE_BOOL: - return parse_bool(); + case Trace::TYPE_FALSE: + return new Bool(false); + case Trace::TYPE_TRUE: + return new Bool(true); case Trace::TYPE_SINT: return parse_sint(); case Trace::TYPE_UINT: @@ -133,8 +135,8 @@ public: return parse_blob(); case Trace::TYPE_POINTER: return parse_pointer(); - case Trace::TYPE_VOID: - return NULL; + case Trace::TYPE_NULL: + return new Null; default: std::cerr << "error: unknown type " << c << "\n"; assert(0); @@ -193,7 +195,7 @@ public: case Trace::TYPE_CONST: read_string(); break; - case Trace::TYPE_VOID: + case Trace::TYPE_NULL: goto done; default: std::cerr << "error: uexpected type " << c << "\n"; -- 2.7.4