]> git.cworth.org Git - apitrace/commitdiff
Handle pointers & bools correctly.
authorJosé Fonseca <jfonseca@vmware.com>
Wed, 24 Nov 2010 20:26:14 +0000 (20:26 +0000)
committerJosé Fonseca <jfonseca@vmware.com>
Wed, 24 Nov 2010 20:26:14 +0000 (20:26 +0000)
glretrace.py
trace_model.cpp
trace_model.hpp

index 5cdcf24bf4cd973bb22c64ae5f1ce51d72a3655e..09f5163fd1e1626b15311ac5165c47f604798ec3 100644 (file)
@@ -44,7 +44,13 @@ class ConstRemover(base.Rebuilder):
 class ValueExtractor(base.Visitor):
 
     def visit_literal(self, literal, lvalue, rvalue):
-        print '    %s = %s;' % (lvalue, rvalue)
+        if literal.format == 'Bool':
+            print '    %s = static_cast<bool>(%s);' % (lvalue, rvalue)
+        else:
+            print '    %s = %s;' % (lvalue, rvalue)
+
+    def visit_const(self, const, lvalue, rvalue):
+        self.visit(const.type, lvalue, rvalue)
 
     def visit_alias(self, alias, lvalue, rvalue):
         self.visit(alias.type, lvalue, rvalue)
@@ -60,7 +66,7 @@ class ValueExtractor(base.Visitor):
         print '    if (__a%s) {' % (array.id)
         length = '__a%s->values.size()' % array.id
         print '        %s = new %s[%s];' % (lvalue, array.type, length)
-        index = '__i' + array.id
+        index = '__j' + array.id
         print '        for(size_t {i} = 0; {i} < {length}; ++{i}) {{'.format(i = index, length = length)
         try:
             self.visit(array.type, '%s[%s]' % (lvalue, index), '*__a%s->values[%s]' % (array.id, index))
@@ -71,8 +77,15 @@ class ValueExtractor(base.Visitor):
             print '    }'
     
     def visit_pointer(self, pointer, lvalue, rvalue):
-        # FIXME
-        raise NotImplementedError
+        print '    const Trace::Array *__a%s = dynamic_cast<const Trace::Array *>(&%s);' % (pointer.id, rvalue)
+        print '    if (__a%s) {' % (pointer.id)
+        print '        %s = new %s;' % (lvalue, pointer.type)
+        try:
+            self.visit(pointer.type, '%s[0]' % (lvalue,), '*__a%s->values[0]' % (pointer.id,))
+        finally:
+            print '    } else {'
+            print '        %s = NULL;' % lvalue
+            print '    }'
 
     def visit_handle(self, handle, lvalue, rvalue):
         self.visit(handle.type, lvalue, "__%s_map[%s]" %(handle.name, rvalue));
@@ -105,7 +118,7 @@ class ValueWrapper(base.Visitor):
         print '    const Trace::Array *__a%s = dynamic_cast<const Trace::Array *>(&%s);' % (array.id, rvalue)
         print '    if (__a%s) {' % (array.id)
         length = '__a%s->values.size()' % array.id
-        index = '__i' + array.id
+        index = '__j' + array.id
         print '        for(size_t {i} = 0; {i} < {length}; ++{i}) {{'.format(i = index, length = length)
         try:
             self.visit(array.type, '%s[%s]' % (lvalue, index), '*__a%s->values[%s]' % (array.id, index))
@@ -114,8 +127,13 @@ class ValueWrapper(base.Visitor):
             print '    }'
     
     def visit_pointer(self, pointer, lvalue, rvalue):
-        # FIXME
-        raise NotImplementedError
+        print '    const Trace::Array *__a%s = dynamic_cast<const Trace::Array *>(&%s);' % (pointer.id, rvalue)
+        print '    if (__a%s) {' % (pointer.id)
+        try:
+            self.visit(pointer.type, '%s[0]' % (lvalue,), '*__a%s->values[0]' % (pointer.id,))
+        finally:
+            print '    }'
+    
 
     def visit_handle(self, handle, lvalue, rvalue):
         print "    __%s_map[static_cast<%s>(%s)] = %s;" % (handle.name, handle.type, rvalue, lvalue)
index 098656fc05c37dee68c3b8591de13f5252abf4ca..74f9c9fb4f761474fd2813fa65bd3aee502cd3ab 100644 (file)
@@ -185,6 +185,14 @@ static inline const Value *unwrap(const Value *node) {
 }
 
 
+Value::operator bool(void) const {
+   const Bool *b = dynamic_cast<const Bool *>(unwrap(this));
+   if (b)
+      return b->value;
+   assert(0);
+   return false;
+}
+
 Value::operator signed long long(void) const {
    const SInt *sint = dynamic_cast<const SInt *>(unwrap(this));
    if (sint)
index f50c6ac2c663161545b73804aefe9a40d1cb776d..8cf1951dbfa27313cf9d965b71cce0fc5daefb84 100644 (file)
@@ -49,6 +49,7 @@ class Value
 public:
    virtual void visit(Visitor &visitor) = 0;
 
+   operator bool (void) const;
    operator signed long long (void) const;
    operator unsigned long long (void) const;
    operator double (void) const;