Handle null more consistently.
authorJosé Fonseca <jfonseca@vmware.com>
Sun, 21 Nov 2010 02:33:38 +0000 (02:33 +0000)
committerJosé Fonseca <jfonseca@vmware.com>
Sun, 21 Nov 2010 02:33:38 +0000 (02:33 +0000)
log.cpp
trace_format.hpp
trace_model.cpp
trace_model.hpp
trace_parser.hpp

diff --git a/log.cpp b/log.cpp
index 5ffc372..5ef3a76 100644 (file)
--- 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) {
index fe37a80..a67acc0 100644 (file)
@@ -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,
index be2293d..ee711ed 100644 (file)
@@ -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<const Array *>(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<const Blob *>(unwrap(this));
-   assert(blob);
-   return blob->buf;
+   if (blob)
+       return blob->buf;
+   const Null *null = dynamic_cast<const Null *>(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) {
index 8089880..d80b2f9 100644 (file)
@@ -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);}
index 674ee8e..565ccaa 100644 (file)
@@ -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";