From 9d7ed7cb4d186baa80b04e0223c659f3d528175a Mon Sep 17 00:00:00 2001
From: "SND\\EreTIk_cp" <SND\EreTIk_cp@9b283d60-5439-405e-af05-b73fd8c4d996>
Date: Thu, 22 Sep 2011 10:05:56 +0000
Subject: [PATCH] [+] pyDia: bit-fields + tests

git-svn-id: https://pykd.svn.codeplex.com/svn@69948 9b283d60-5439-405e-af05-b73fd8c4d996
---
 pykd/dbgext.cpp              |  2 ++
 test/scripts/diatest.py      | 16 +++++++++++++++-
 test/targetapp/targetapp.cpp |  7 +++++++
 3 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/pykd/dbgext.cpp b/pykd/dbgext.cpp
index f711c41..072caed 100644
--- a/pykd/dbgext.cpp
+++ b/pykd/dbgext.cpp
@@ -157,6 +157,8 @@ BOOST_PYTHON_MODULE( pykd )
             "Retrieves a flag of basic type for symbol")
         .def( "baseType", &pyDia::Symbol::getBaseType,
             "Retrieves the base type for this symbol")
+        .def( "bitPos", &pyDia::Symbol::getBitPosition,
+            "Retrieves the base type for this symbol")
         .def( "__str__", &pyDia::Symbol::print)
         .def("__getitem__", &pyDia::Symbol::getChildByName)
         .def("__len__", &pyDia::Symbol::getChildCount )
diff --git a/test/scripts/diatest.py b/test/scripts/diatest.py
index 6697c55..b997ed7 100644
--- a/test/scripts/diatest.py
+++ b/test/scripts/diatest.py
@@ -59,4 +59,18 @@ class DiaTest( unittest.TestCase ):
     self.assertEqual(pykd.btBool, globalScope["g_constBoolValue"].type().baseType())
     self.assertEqual(pykd.btULong, globalScope["g_ulongValue"].type().baseType())
 
-
+  def testBits(self):
+    globalScope = pykd.diaOpenPdb( str(target.module.pdb()) )
+    structWithBits = globalScope["structWithBits"]
+    bitField = structWithBits["m_bit0_4"]
+    self.assertEqual(pykd.LocIsBitField, bitField.locType())
+    self.assertEqual(0, bitField.bitPos())
+    self.assertEqual(5, bitField.size())
+    bitField = structWithBits["m_bit5"]
+    self.assertEqual(pykd.LocIsBitField, bitField.locType())
+    self.assertEqual(5, bitField.bitPos())
+    self.assertEqual(1, bitField.size())
+    bitField = structWithBits["m_bit6_7"]
+    self.assertEqual(pykd.LocIsBitField, bitField.locType())
+    self.assertEqual(6, bitField.bitPos())
+    self.assertEqual(2, bitField.size())
diff --git a/test/targetapp/targetapp.cpp b/test/targetapp/targetapp.cpp
index 00c395f..8a74f17 100644
--- a/test/targetapp/targetapp.cpp
+++ b/test/targetapp/targetapp.cpp
@@ -17,6 +17,13 @@ ULONGLONG g_ulonglongValue = 8;
 
 std::string g_string;
 
+struct structWithBits {
+    ULONG m_bit0_4  : 5;
+    ULONG m_bit5    : 1;
+    ULONG m_bit6_7  : 2;
+};
+structWithBits g_structWithBits = {0};
+
 void FuncWithName0()
 {
 }