Re: [PATCH] libstdc++ - Add xmethods for associative containers (ordered and unordered)

2014-11-11 Thread Jonathan Wakely

On 10/11/14 21:49 +, Jonathan Wakely wrote:

On 09/11/14 16:00 -0800, Siva Chandra wrote:

Hello,

Attached is a patch which adds xmethods for the associative containers
(set, map, multiset and multimap) and their unordered versions. I
think the GDB Python API is not rich enough to implement xmethods for
the more interesting methods like find, count etc. The attached patch
only implements xmethods for size and empty. That way, it is a fairly
straightforward patch.


This looks fine, I'll commit it soon. Thanks.


Committed to trunk.



Re: [PATCH] libstdc++ - Add xmethods for associative containers (ordered and unordered)

2014-11-11 Thread Siva Chandra
On Tue, Nov 11, 2014 at 5:03 AM, Siva Chandra sivachan...@google.com wrote:
 On Tue, Nov 11, 2014 at 3:38 AM, Jonathan Wakely jwak...@redhat.com wrote:
 On 10/11/14 21:49 +, Jonathan Wakely wrote:

 On 09/11/14 16:00 -0800, Siva Chandra wrote:

 Hello,

 Attached is a patch which adds xmethods for the associative containers
 (set, map, multiset and multimap) and their unordered versions. I
 think the GDB Python API is not rich enough to implement xmethods for
 the more interesting methods like find, count etc. The attached patch
 only implements xmethods for size and empty. That way, it is a fairly
 straightforward patch.


 This looks fine, I'll commit it soon. Thanks.


 Committed to trunk.

Thanks for the quick review and commit.

(Sorry for the premature Send earlier.)


Re: [PATCH] libstdc++ - Add xmethods for associative containers (ordered and unordered)

2014-11-11 Thread Jonathan Wakely

On 11/11/14 11:38 +, Jonathan Wakely wrote:

On 10/11/14 21:49 +, Jonathan Wakely wrote:

On 09/11/14 16:00 -0800, Siva Chandra wrote:

Hello,

Attached is a patch which adds xmethods for the associative containers
(set, map, multiset and multimap) and their unordered versions. I
think the GDB Python API is not rich enough to implement xmethods for
the more interesting methods like find, count etc. The attached patch
only implements xmethods for size and empty. That way, it is a fairly
straightforward patch.


This looks fine, I'll commit it soon. Thanks.


Committed to trunk.


I forgot to 'git add' the new test before committing, done now.


Re: [PATCH] libstdc++ - Add xmethods for associative containers (ordered and unordered)

2014-11-10 Thread Jonathan Wakely

On 09/11/14 16:00 -0800, Siva Chandra wrote:

Hello,

Attached is a patch which adds xmethods for the associative containers
(set, map, multiset and multimap) and their unordered versions. I
think the GDB Python API is not rich enough to implement xmethods for
the more interesting methods like find, count etc. The attached patch
only implements xmethods for size and empty. That way, it is a fairly
straightforward patch.


This looks fine, I'll commit it soon. Thanks.


[PATCH] libstdc++ - Add xmethods for associative containers (ordered and unordered)

2014-11-09 Thread Siva Chandra
Hello,

Attached is a patch which adds xmethods for the associative containers
(set, map, multiset and multimap) and their unordered versions. I
think the GDB Python API is not rich enough to implement xmethods for
the more interesting methods like find, count etc. The attached patch
only implements xmethods for size and empty. That way, it is a fairly
straightforward patch.

libstdc++-v3/ChangeLog:

2014-11-09  Siva Chandra Reddy  sivachan...@google.com

* python/libstdcxx/v6/xmethods.py: Add xmethods for associative
containers.
* testsuite/libstdc++-xmethods/associative-containers.cc: New
file.
diff --git a/libstdc++-v3/python/libstdcxx/v6/xmethods.py 
b/libstdc++-v3/python/libstdcxx/v6/xmethods.py
index 6af1c95..2198411 100644
--- a/libstdc++-v3/python/libstdcxx/v6/xmethods.py
+++ b/libstdc++-v3/python/libstdcxx/v6/xmethods.py
@@ -422,6 +422,50 @@ class VectorMethodsMatcher(gdb.xmethod.XMethodMatcher):
 return None
 return method.worker_class(class_type.template_argument(0))
 
+# Xmethods for associative containers
+
+class AssociativeContainerWorkerBase(gdb.xmethod.XMethodWorker):
+def __init__(self, unordered):
+self._unordered = unordered
+
+def node_count(self, obj):
+if self._unordered:
+return obj['_M_h']['_M_element_count']
+else:
+return obj['_M_t']['_M_impl']['_M_node_count']
+
+def get_arg_types(self):
+return None
+
+class AssociativeContainerEmptyWorker(AssociativeContainerWorkerBase):
+def __call__(self, obj):
+return int(self.node_count(obj)) == 0
+
+class AssociativeContainerSizeWorker(AssociativeContainerWorkerBase):
+def __call__(self, obj):
+return self.node_count(obj)
+
+class AssociativeContainerMethodsMatcher(gdb.xmethod.XMethodMatcher):
+def __init__(self, name):
+gdb.xmethod.XMethodMatcher.__init__(self,
+matcher_name_prefix + name)
+self._name = name
+self._method_dict = {
+'size': LibStdCxxXMethod('size', AssociativeContainerSizeWorker),
+'empty': LibStdCxxXMethod('empty',
+  AssociativeContainerEmptyWorker),
+}
+self.methods = [self._method_dict[m] for m in self._method_dict]
+
+def match(self, class_type, method_name):
+if not re.match('^std::%s.*$' % self._name, class_type.tag):
+return None
+method = self._method_dict.get(method_name)
+if method is None or not method.enabled:
+return None
+unordered = 'unordered' in self._name
+return method.worker_class(unordered)
+
 # Xmethods for std::unique_ptr
 
 class UniquePtrGetWorker(gdb.xmethod.XMethodWorker):
@@ -465,4 +509,20 @@ def register_libstdcxx_xmethods(locus):
 gdb.xmethod.register_xmethod_matcher(locus, DequeMethodsMatcher())
 gdb.xmethod.register_xmethod_matcher(locus, ListMethodsMatcher())
 gdb.xmethod.register_xmethod_matcher(locus, VectorMethodsMatcher())
+gdb.xmethod.register_xmethod_matcher(
+locus, AssociativeContainerMethodsMatcher('set'))
+gdb.xmethod.register_xmethod_matcher(
+locus, AssociativeContainerMethodsMatcher('map'))
+gdb.xmethod.register_xmethod_matcher(
+locus, AssociativeContainerMethodsMatcher('multiset'))
+gdb.xmethod.register_xmethod_matcher(
+locus, AssociativeContainerMethodsMatcher('multimap'))
+gdb.xmethod.register_xmethod_matcher(
+locus, AssociativeContainerMethodsMatcher('unordered_set'))
+gdb.xmethod.register_xmethod_matcher(
+locus, AssociativeContainerMethodsMatcher('unordered_map'))
+gdb.xmethod.register_xmethod_matcher(
+locus, AssociativeContainerMethodsMatcher('unordered_multiset'))
+gdb.xmethod.register_xmethod_matcher(
+locus, AssociativeContainerMethodsMatcher('unordered_multimap'))
 gdb.xmethod.register_xmethod_matcher(locus, UniquePtrMethodsMatcher())
diff --git 
a/libstdc++-v3/testsuite/libstdc++-xmethods/associative-containers.cc 
b/libstdc++-v3/testsuite/libstdc++-xmethods/associative-containers.cc
new file mode 100644
index 000..7949f22
--- /dev/null
+++ b/libstdc++-v3/testsuite/libstdc++-xmethods/associative-containers.cc
@@ -0,0 +1,79 @@
+// { dg-do run }
+// { dg-options -std=gnu++11 -g -O0 }
+
+// Copyright (C) 2014 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should