aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2016-09-19 16:49:19 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2016-09-19 16:49:19 +0100
commit019270bcb3ff03b1dfb5a48b436af54e1d660421 (patch)
treeba1b34e71f7f5241574fe23af7f24de9c405a8f4
parentfc15d9ecb432173f2a17c58352d4b70c1ee049e4 (diff)
downloadgcc-019270bcb3ff03b1dfb5a48b436af54e1d660421.zip
gcc-019270bcb3ff03b1dfb5a48b436af54e1d660421.tar.gz
gcc-019270bcb3ff03b1dfb5a48b436af54e1d660421.tar.bz2
libstdc++/77645 Fix xmethods for std::list
PR libstdc++/77645 * python/libstdcxx/v6/xmethods.py (DequeWorkerBase.index): Rename argument. (ListWorkerBase.get_value_from_node): Define new method. (ListFrontWorker.__call__, ListBackWorker.__call__): Use it. From-SVN: r240233
-rw-r--r--libstdc++-v3/ChangeLog8
-rw-r--r--libstdc++-v3/python/libstdcxx/v6/xmethods.py19
2 files changed, 22 insertions, 5 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 70ff276..8bbd29c 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,11 @@
+2016-09-19 Jonathan Wakely <jwakely@redhat.com>
+
+ PR libstdc++/77645
+ * python/libstdcxx/v6/xmethods.py (DequeWorkerBase.index): Rename
+ argument.
+ (ListWorkerBase.get_value_from_node): Define new method.
+ (ListFrontWorker.__call__, ListBackWorker.__call__): Use it.
+
2016-09-17 Jonathan Wakely <jwakely@redhat.com>
* python/libstdcxx/v6/printers.py (StdVariantPrinter): Define.
diff --git a/libstdc++-v3/python/libstdcxx/v6/xmethods.py b/libstdc++-v3/python/libstdcxx/v6/xmethods.py
index eccd574..95f9af9 100644
--- a/libstdc++-v3/python/libstdcxx/v6/xmethods.py
+++ b/libstdc++-v3/python/libstdcxx/v6/xmethods.py
@@ -174,10 +174,10 @@ class DequeWorkerBase(gdb.xmethod.XMethodWorker):
first = obj['_M_impl']['_M_finish']['_M_first']
return (last_node - first_node) * self._bufsize + (cur - first)
- def index(self, obj, index):
+ def index(self, obj, idx):
first_node = obj['_M_impl']['_M_start']['_M_node']
- index_node = first_node + index / self._bufsize
- return index_node[0][index % self._bufsize]
+ index_node = first_node + idx / self._bufsize
+ return index_node[0][idx % self._bufsize]
class DequeEmptyWorker(DequeWorkerBase):
def get_arg_types(self):
@@ -328,6 +328,15 @@ class ListWorkerBase(gdb.xmethod.XMethodWorker):
def get_arg_types(self):
return None
+ def get_value_from_node(self, node):
+ node = node.dereference()
+ if node.type.fields()[1].name == '_M_data':
+ # C++03 implementation, node contains the value as a member
+ return node['_M_data']
+ # C++11 implementation, node stores value in __aligned_membuf
+ addr = node['_M_storage'].address
+ return addr.cast(self._val_type.pointer()).dereference()
+
class ListEmptyWorker(ListWorkerBase):
def get_result_type(self, obj):
return get_bool_type()
@@ -358,7 +367,7 @@ class ListFrontWorker(ListWorkerBase):
def __call__(self, obj):
node = obj['_M_impl']['_M_node']['_M_next'].cast(self._node_type)
- return node['_M_data']
+ return self.get_value_from_node(node)
class ListBackWorker(ListWorkerBase):
def get_result_type(self, obj):
@@ -366,7 +375,7 @@ class ListBackWorker(ListWorkerBase):
def __call__(self, obj):
prev_node = obj['_M_impl']['_M_node']['_M_prev'].cast(self._node_type)
- return prev_node['_M_data']
+ return self.get_value_from_node(prev_node)
class ListMethodsMatcher(gdb.xmethod.XMethodMatcher):
def __init__(self):